mysql约束

约束

  • not null
  • unique
  • primary key
  • foreign key
  • check

一、主键

what?

​ 用于唯一的表示表行的数据。当定义主键后,行不能重复。

how?

1
2
3
4
5
6
7
定义方式
1. 字段名 PRIMARY KEY
CREATE TABLE a17 (id INT PRIMARY KEY);
2. 在表定义最后写 PRIMARY KEY(列名)
CREATE TABLE a178(id INT , `name` VARCHAR(32), PRIMARY KEY(id,`name`) ---复合主键
);

特点:

  1. 主键的值不能重复 且 不能为==null==。

  2. 一张表只能有一个主键,但是可以是复合主键(把多个字段看成一个)

  3. 复合组件( id+name ) 的值不能相同。

    1
    2
    3
    4
    CREATE 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'

微信图片_20221109163416

微信图片_20221109163426

二、unique

what?

​ 不能重复的子弹

特点:

  1. 如果没有指定 not null ,则 unique 字段可以有多个 null
  2. 如果一个列(字段),是 unique not null 使用效果类似 primary key
  3. 一张表中可以有==多个unique==

三、外键

what?

​ 定义主表和从表之间的关系:外键约束

how?

1
2
3
4
5
6
7
8
9
10
FOREIGN KEY (从表字段名)) REFERENCES 主表名(主表字段名));

eg:

-- 创建主表 my_class
CREATE TABLE my_class(id INT PRIMARY KEY,`name` VARCHAR(32) NOT NULL DEFAULT '');
-- 创建从表 my_student
CREATE TABLE my_student(id INT PRIMARY KEY,`name` VARBINARY(32) NOT NULL DEFAULT '',class_id INT,
-- 下面指定外键关系
FOREIGN KEY (class_id) REFERENCES my_class(id));

image-20221109190207611

外键约束案例:
image-20221109190520461

1.这里的 300 会插入失败。

且:

==数据不能随意删除==

​ 2.如果sn_002 中的class_id 和 id =200 形成外键,那 班级表中 id=200 这条记录不能直接删除。

需要先删除 sn_002 这个记录,再删除 班级表中 id=200 的记录。

不能删除主键中 , 在从表中的外键绑定了 的数据。

案例分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
INSERT INTO my_class VALUES(100,"java"),(200,"web");
SELECT * FROM my_class;
+-----+------+
| id | name |
+-----+------+
| 100 | java |
| 200 | web |
+-----+------+
2 rows in set (0.01 sec)
INSERT INTO my_student VALUE(1,"tom",100);
INSERT INTO my_student VALUE(2,"jack",200);
INSERT INTO my_student VALUE(3,"hsp",300); -- 这里会失败,因为 300班级不存在
SELECT * FROM my_student;
+----+------------+----------+
| id | name | class_id |
+----+------------+----------+
| 1 | 0x746F6D | 100 |
| 2 | 0x6A61636B | 200 |
+----+------------+----------+
2 rows in set (0.00 sec)

要求:

  1. 主表中必须为主键或者 unique?

    外键指向的必须是唯一的。

  2. 表的类型是 innodb ,这样的表才能支持外键。

  3. 外键字段的类型要和主键字段的==类型一致==(长度可以不同)。

  4. 外键字段的值,必须在主段字段中出现过,或者为null【前提是外键字段允许为null]

    1
    2
    我一开始不知道这个学生将来是什么班级,那就为空
    INSERT INTO my_student VALUE4,"hwc",null);
  5. 一旦建立主外键关系,数据就不能随意删除了。

    上面的外键案例。

    从表中有 外键 指向主表中的一条记录的字段,则该主表中的该条记录不能直接删除。

    怎么解决?

    删除 从表中外键和 该主表记录有联系的 从表所有记录。