列级约束:对一个数据列建立的约束
表级约束:对多个数据列建立的约束(只在列定义后声明)

主键约束 primary key

自增:auto_increment(可索引)

  1. 唯一
  2. 不能为NULL
  3. 每表只有一列主键

    添加

    1. alter table tb add [constraint 约束名] primary key (col);

    去除

    1. alter table tb drop primary key;

    删除影响

    一条条删除,主键继续延续之前的

  1. delete table tb;

摧毁表,主键从1开始

  1. truncate table tb;

生成特殊主键

年月日+随机数:20210411000275

步骤一:将下段代码新建为函数seq_no(可修改)

  1. DECLARE v_cnt INT;
  2. DECLARE v_timestr INT;
  3. DECLARE rowcount BIGINT;
  4. SET v_timestr=DATE_FORMAT(NOW(),'%Y%m%d');
  5. SELECT ROUND(RAND()*100,0)+1 INTO v_cnt;
  6. START TRANSACTION;
  7. UPDATE tb SET order_sn=order_sn+v_cnt WHERE timestr=v_timestr;
  8. IF ROW_COUNT()=0 THEN
  9. INSERT INTO tb(timestr,order_sn)VALUES(v_timestr,v_cnt);
  10. END IF;
  11. SELECT CONCAT(v_timestr,LPAD(order_sn,7,0))AS order_sn
  12. FROM tb WHERE timestr=V_timestr;
  13. COMMIT;

步骤二:生成临时表:tb

  1. create table tb (timestr int primary key,order_sn int);

步骤三:调用函数

  1. call seq_no();

步骤四:用于各表主键(可修改)

  1. insert tb1 (id) select timestr+order_sn FROM tb;

外键约束 foreign key

(不推荐,会造成外键闭环,很难删除记录)

外键列:foreign key
参照列:references (父表)
作用:保证数据一致性、完整性,实现1对1或1对多关系

  1. 父表和子表使用相同的存储引擎InnoDB,禁用临时表
  2. 外键列和参照列的数据类型要相似,数字长度和符号位要相同
  3. 参照列必须创建索引,外键列可自动创建
  4. 避免外键闭环,无法删除任何一张表的记录

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

  1. 唯一
  2. 可为NULL(同列可出现多个NULL)
  3. 每表可有多列唯一

添加唯一约束:alter table 表名 add [constraint 约束名] unique (列名);
删除唯一约束:alter table 表名 drop index 列名;

非空 not null

默认 default

添加默认约束:alter table 表名 alter 列名 set default 值;
删除默认约束:alter table 表名 alter 列名 drop default;