约束
- not null
- unique
- primary key
- foreign key
- check
一、主键
what?
用于唯一的表示表行的数据。当定义主键后,行不能重复。
how?
1 | 定义方式 |
特点:
主键的值不能重复 且 不能为==null==。
一张表只能有一个主键,但是可以是复合主键(把多个字段看成一个)
复合组件( id+name ) 的值不能相同。
1
2
3
4CREATE TABLE a178(id INT , `name` VARCHAR(32), PRIMARY KEY(id,`name`) ---复合主键 );
INSERT INTO a178 VALUES(1,'tom');
INSERT INTO a178 VALUES(1,'SICK'); ----合起来不同可以
INSERT INTO a178 VALUES(1,'tom'); -----合起来相同不行--Duplicate entry '1-tom' for key 'a178.PRIMARY'
二、unique
what?
不能重复的子弹
特点:
- 如果没有指定 not null ,则 unique 字段可以有多个 null
- 如果一个列(字段),是 unique not null 使用效果类似 primary key
- 一张表中可以有==多个unique==
三、外键
what?
定义主表和从表之间的关系:外键约束
how?
1 | FOREIGN KEY (从表字段名)) REFERENCES 主表名(主表字段名)); |
外键约束案例:
1.这里的 300 会插入失败。
且:
==数据不能随意删除==
2.如果sn_002 中的class_id 和 id =200 形成外键,那 班级表中 id=200 这条记录不能直接删除。
需要先删除 sn_002 这个记录,再删除 班级表中 id=200 的记录。
不能删除主键中 , 在从表中的外键绑定了 的数据。
案例分析
1 | INSERT INTO my_class VALUES(100,"java"),(200,"web"); |
要求:
主表中必须为主键或者 unique?
外键指向的必须是唯一的。
表的类型是 innodb ,这样的表才能支持外键。
外键字段的类型要和主键字段的==类型一致==(长度可以不同)。
外键字段的值,必须在主段字段中出现过,或者为null【前提是外键字段允许为null]
1
2我一开始不知道这个学生将来是什么班级,那就为空
INSERT INTO my_student VALUE4,"hwc",null);一旦建立主外键关系,数据就不能随意删除了。
上面的外键案例。
从表中有 外键 指向主表中的一条记录的字段,则该主表中的该条记录不能直接删除。
怎么解决?
删除 从表中外键和 该主表记录有联系的 从表所有记录。