常见类型
数值型
整型:
小数:
浮点型
定点型
字符型:短文本 长文本
日期型:
Blob类型:较长的二进制数据
整型
如何不设置有符号和无符号默认有符号
UNSIGNED 这是无符号
如果数据超出范围,会报警告 而且插入临界值
如果不设置长度有默认的长度 对于整型,是由前面的类型决定的
ZEROFILL 零填充 比如 int(4) 对于插入数据 11 为,0011
长度代表了显示的最大宽度
小数
特点:
double(M,D)
M:整数位和小数位一共多少位数
D:保留的几位小数
超过范围,插入临界值
缺省情况:
如果是decimal 则M默认值是10,D默认是0
如果是float和double,默认值是插入的数值的长度精度
定点型插入数据精度高
选择的原则:越简单越好,能保存的数据范围越小越好
字符型
char是固定长度(默认为1) varchar 是可变长度 长度必须写
set保存集合
长文本 text blob (存储较大的二进制)
日期类型
datetime和timestamp的区别
常见约束
含义:用来限制表中的数据,围殴了保证数据的一致性
分类:
1.NOT NULL 非空约束 用于保证该字段的值不能为空 比如姓名学号
2.DEFAULT 默认约束 用于保证该字段有默认值
3.PRIMARY KEY 主键 保证字节的值具有唯一性,而且非空
4.UNIQUE 唯一,用于保证该字段的为一直,可以为空
5.CHECK 检查约束 Mysql 不支持 年龄性别
6.FOREIGN KEY 外键约束 用于限制两个表的关系,用于保证此字段的值必须来自另一个表的一个列的值 从表添加外键约束 用于引用主表的某列的值
添加约束的时机
1.创建表的时候
2.需改表的时候
约束添加的分类
1.列级约束 : 六大约束都可以写 但是外键约束没有效果
2.表级约束 : 除了非空,默认,其他都支持
列级约束 : 六大约束都可以写 但是外键约束没有效果
CREATE TABLE stuinfo(
id INT PRIMARY KEY, #主键
stuName VARCHAR(20) NOT NULL, #非空
gender CHAR(1) CHECK(gender='男' OR gender='女') , # 检查
seat INT UNIQUE, #唯一
age INT DEFAULT 18 #默认
);
SHOW INDEX FROM stuinfo;
//查看表索引 主键 外键 唯一 以及自己创建的索引
添加表级约束
语法: 在各个字段的下面
CONSISTENT 约束名 约束类型(字段名)
CREATE TABLE stuinfo2(
id INT,
username VARCHAR(20),
gender CHAR(1),
seat INT,
age INT,
majorid INT,
CONSISTENT pk PRIMARY KEY(id),#主键
CONSISTENT uq UNIQUE(seat), #唯一约束
CONSISTENT ck CHECK(gender = '男' OR gender = '女') ,#检查
CONSISTENT fk_stuinfo_major FOREIGN KEY(major) REFERENCES major(id) # 外键
)
主键和唯一的对比
1.都可以保证唯一性
2.主键不允许为空 唯一可以为空 但是唯一只能有一个为null
3.主键至多有一个 唯一可以有多个
4.是否允许组合 组合主键(但是不推荐) 组合唯一键
外键:
1.要求在从表设置外键关系
2.从表的外键列类型必须和主表的关联列相同,名称无要求
3.主表的关联列必须是一个key(一般是主键或者是唯一)
4.插入数据的时候,先插入主表,然后再删除从表
5.删除数据的时候,需要先删除从表,然后再删除主表
修改表的时候添加约束
CREATE TABLE stuinfo3(
id INT,
username VARCHAR(20),
gender CHAR(1),
seat INT,
age INT
);
#添加非空约束
ALTER TABLE stuinfo3 MODIFY COLUMN username VARCHAR(30) NOT null;
#添加默认约束
ALTER TABLE stuinfo3 MODIFY COLUMN age INT DEFAULT 18;
#添加主键
#列级约束
ALTER TABLE stuinfo3 MODIFY COLUMN id INT PRIMARY KEY;
#表级约束
ALTER TABLE stuinfo3 ADD PRIMARY KEY(id);
#添加唯一键
#列级约束
ALTER TABLE stuinfo3 MODIFY COLUMN seat INT UNIQUE;
#表级约束
ALTER TABLE stuinfo3 ADD UNIQUE(seat);
#添加外键
ALTER TABLE stuinfo3 ADD FOREIGN KEY(majorid) REFERENCES major(id);
ALTER TABLE stuinfo3 ADD CONSTRAINT fk_stuinfo3_major FOREIGN KEY(majorid) REFERENCES major(id);
添加列级约束
alter table 表名 modify column 字段名 字段类型 新约束
添加表级约束
alter table 表明 add [constraint 约束名] 约束类型 (字段名) [外键的引用]
修改表的时候删除约束
#删除非空约束
ALTER TABLE stuinfo3 MODIFY COLUMN username VARCHAR(20) NULL;
#删除默认约束
ALTER TABLE stuinfo3 MODIFY COLUMN age INT;
#删除主键
ALTER TABLE stuinfo3 DROP PRIMARY KEY;
#删除唯一键
ALTER TABLE stuinfo3 DROP INDEX seat;
#删除外键约束
ALTER TABLE stuinfo3 DROP FOREIGN KEY fk_stuinfo3_major;
标识列 又称为自增长列
创建表的时候设置标识列
CREATE TABLE stuinfo4(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(20),
gender CHAR(1),
seat INT,
age INT
);
特点:
1.标识别必须和key(主键,唯一键)搭配
2.一个表只有一个标识列
3.标识列的类型,只能是数值型
4.标识列可以通过 SET auto_incrment_increment = 3; 设置增加的大小
5.可以手动设置起始值
#修改表的时候设置标识列
ALTER TABLE stuinfo5 MODIFY COLUMN id INT PRIMARY KEY AUTO_INCREMENT;
#修改表的时候删除标识列
ALTER TABLE stuinfo5 MODIFY COLUMN id INT PRIMARY KEY;
TCL 事务控制语言
SHOW ENGINES; //查询引擎
事务的特点
事务的分类:
隐式事务,没有明显的开启和结束事务的标志
比如
insert、update、delete语句本身就是一个事务
显式事务,具有明显的开启和结束事务的标志
1、开启事务
取消自动提交事务的功能
2、编写事务的一组逻辑操作单元(多条sql语句)
insert
update
delete
3、提交事务或回滚事务
使用到的关键字
set autocommit=0;
start transaction;
commit;
rollback;
savepoint 断点
commit to 断点
rollback to 断点
SHOW VARIABLES LIKE '%autocommit%';//查询事务是否开启 或者查询其他的
数据库的隔离级别
事务并发问题如何发生?
当多个事务同时操作同一个数据库的相同数据时
事务的并发问题有哪些?
脏读:一个事务读取到了另外一个事务未提交的数据
不可重复读:同一个事务中,多次读取到的数据不一致
幻读:一个事务读取数据时,另外一个事务进行更新,导致第一个事务读取到了没有更新的数据
如何避免事务的并发问题?
通过设置事务的隔离级别
1、READ UNCOMMITTED
2、READ COMMITTED 可以避免脏读
3、REPEATABLE READ 可以避免脏读、不可重复读和一部分幻读
4、SERIALIZABLE可以避免脏读、不可重复读和幻读
设置隔离级别:
set session|global transaction isolation level 隔离级别名;
查看隔离级别:
select @@tx_isolation;
事务中的一个关键词 savepoint 回滚点,设置 只能搭配 rollback 使用
语句1
savepoint a;
语句2
rollback to a;