列级约束:对一个数据列建立的约束
表级约束:对多个数据列建立的约束(只在列定义后声明)
主键约束 primary key
自增:auto_increment(可索引)
- 唯一
- 不能为NULL
- 每表只有一列主键
添加
alter table tb add [constraint 约束名] primary key (col);
去除
alter table tb drop primary key;
删除影响
一条条删除,主键继续延续之前的
delete table tb;
摧毁表,主键从1开始
truncate table tb;
生成特殊主键
年月日+随机数:20210411000275
步骤一:将下段代码新建为函数seq_no(可修改)
DECLARE v_cnt INT;DECLARE v_timestr INT;DECLARE rowcount BIGINT;SET v_timestr=DATE_FORMAT(NOW(),'%Y%m%d');SELECT ROUND(RAND()*100,0)+1 INTO v_cnt;START TRANSACTION;UPDATE tb SET order_sn=order_sn+v_cnt WHERE timestr=v_timestr;IF ROW_COUNT()=0 THENINSERT INTO tb(timestr,order_sn)VALUES(v_timestr,v_cnt);END IF;SELECT CONCAT(v_timestr,LPAD(order_sn,7,0))AS order_snFROM tb WHERE timestr=V_timestr;COMMIT;
步骤二:生成临时表:tb
create table tb (timestr int primary key,order_sn int);
步骤三:调用函数
call seq_no();
步骤四:用于各表主键(可修改)
insert tb1 (id) select timestr+order_sn FROM tb;
外键约束 foreign key
(不推荐,会造成外键闭环,很难删除记录)
外键列:foreign key
参照列:references (父表)
作用:保证数据一致性、完整性,实现1对1或1对多关系
- 父表和子表使用相同的存储引擎InnoDB,禁用临时表
- 外键列和参照列的数据类型要相似,数字长度和符号位要相同
- 参照列必须创建索引,外键列可自动创建
- 避免外键闭环,无法删除任何一张表的记录
on delete cascade:从父表删除或更新匹配行,同步子表
on delete set null:从父表删除或更新匹配行,子表对应值为空
on delete restrict/no action:拒绝从父表删除或更新匹配行
添加外键约束:alter table 表名 add [constraint 约束名] foreign key (外键列名) references 参照表(参照列);
删除外键约束:alter table 表名 drop foreign key 约束名;
(系统自带的话,约束名可从show create table 表名里查)
唯一 unique
- 唯一
- 可为NULL(同列可出现多个NULL)
- 每表可有多列唯一
添加唯一约束:alter table 表名 add [constraint 约束名] unique (列名);
删除唯一约束:alter table 表名 drop index 列名;
非空 not null
默认 default
添加默认约束:alter table 表名 alter 列名 set default 值;
删除默认约束:alter table 表名 alter 列名 drop default;
