【MySQL】表的约束

概念

所谓约束,顾名思义就是一种束缚,一种规则,只有满足了约束条件才可以进行下一步的操作。而至于为什么要有约束呢?我们可以类比一下我们在校园的生活。在学校里是不是有很多的校规啊,每个班级上也有自己的班规,每个学生都需要进行遵守,一旦没有遵守那么校园生活将不再是阳光的。所以对于数据库来讲,数据库存取数据的媒介,用户可以向数据库中插入数据,那是不是可以随便插入呢?比如说插入学生的基本信息,比如身份证,省份证的卡槽能不能为空呢?省份证的格式输入有没有正确呢?是不是18为的呢?等等等等。所以数据库中定义了约束,让我们未来插入数据库中的数据是符合预期的,并保证数据的完整性和可预期性。

空属性

  • 两个值:null(默认的)和not null(不为空)
  • 数据库默认字段基本都是字段为空,但是实际开发时,尽可能保证字段不为空,因为数据为空没办法参与运算。就比如我们登陆qq或者微信的时候,我们的密码槽是不能为空的。
mysql> select null;
+------+
| NULL |
+------+
| NULL |
+------+
1 row in set (0.00 sec)

NULL是不能进行计算的
mysql> select 1+null;
+--------+
| 1+null |
+--------+
|   NULL |
+--------+
1 row in set (0.00 sec)

案例:
比如我们创建一个学生的信息,我们要有学生的姓名,省份证,以及其他信息。
按照常识,一个人的信息肯定不能少了身份证,因为身份证是标识唯一公民的重要手段,所以这里就需要对名字和身份证做约束,不能让这两个信息为空。

mysql> create table db1(
    -> name varchar(20) not null,
    -> id char(18) not null,
    -> other varchar(20)
    -> );
Query OK, 0 rows affected (0.03 sec)

mysql> desc db1;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name  | varchar(20) | NO   |     | NULL    |       |
| id    | char(18)    | NO   |     | NULL    |       |
| other | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

因为name和id插入NULL,插入失败
mysql> insert into db1 (name, id, other) values (NULL, NULL, 'other');
ERROR 1048 (23000): Column 'name' cannot be null
没有插入默认是NULL
mysql> insert into db1 (other) values ('other');
ERROR 1364 (HY000): Field 'name' doesn't have a default value
只有插入了name和id才能插入成功
mysql> insert into db1 (name, id, other) values ('张三','12345678912', 'other');
Query OK, 1 row affected (0.00 sec)

默认值(default)

默认值:某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户可以选择性的使用默认值。

示例:

mysql> create table db2(
    -> name varchar(20),
    -> age tinyint default 18,
    -> sex char(1) default '男'
    -> );
    
mysql> desc db2;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name  | varchar(20) | YES  |     | NULL    |       |
| age   | tinyint     | YES  |     | 18      |       |
| sex   | char(1)     | YES  |     ||       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

mysql> insert into db2 (name, age, sex) values ('张三',19,'女');
Query OK, 1 row affected (0.01 sec)

mysql> insert into db2 (name) values ('李四');
Query OK, 1 row affected (0.00 sec)

mysql> select * from db2;
+--------+------+------+
| name   | age  | sex  |
+--------+------+------+
| 张三   |   19 ||
| 李四   |   18 ||
+--------+------+------+
2 rows in set (0.00 sec)

not null和default的关系

mysql> create table db3(
    -> name varchar(20) not null,
    -> age tinyint default 18,
    -> sex char(1) not null default '男'
    -> );
Query OK, 0 rows affected (0.03 sec)

mysql> desc db3;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name  | varchar(20) | NO   |     | NULL    |       |
| age   | tinyint     | YES  |     | 18      |       |
| sex   | char(1)     | NO   |     ||       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

mysql> insert into db3 (name,age,sex) values ('张三',19,'女');
Query OK, 1 row affected (0.00 sec)

# 这里因为name设置了not null所以不能设置为null
mysql> insert into db3 (name,age,sex) values (NULL,19,'女'); 
ERROR 1048 (23000): Column 'name' cannot be null

# 但是这里如果我们不写,这里报错确实没有default值
mysql> insert into db3 (age,sex) values (19,'女');
ERROR 1364 (HY000): Field 'name' doesn't have a default value

# 而这里因为sex即设置了not null 有设置了 default,所以只是不能设置为null,但是可以使用默认值
mysql> insert into db3 (name) values ('张三');
Query OK, 1 row affected (0.00 sec)
mysql> insert into db3 (name,sex) values ('张三',NULL);
ERROR 1048 (23000): Column 'sex' cannot be null

所以综上,我们可以得出not null 和default的关系:如果在建表中只设置了default默认值的话,如果用户没有主动设置值,则使用默认值,如果用户设置了值,则使用用户设定的值。而如果只是设置了not null的话,用户是不能设置为NULL的,但是如果用户没有指定这一列插入的话mysql就会去看default默认值,如果没有默认值的话就会报错,如果有默认值,则使用默认值。所以default和not null不冲突,而是互补。

列描述(comment)

列描述:comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA来进行了解。你可以理解为,我们平时写代码时写的注释。

示例:

mysql> create table db4(
    -> name varchar(20) not null comment '这个是用户的用户名',
    -> age tinyint default 18 comment '这个是用户的年龄',
    -> sex char(1) default '男' comment '这个是用户的性别'
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql> desc db4;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name  | varchar(20) | NO   |     | NULL    |       |
| age   | tinyint     | YES  |     | 18      |       |
| sex   | char(1)     | YES  |     ||       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

mysql> show create table db4 \G
*************************** 1. row ***************************
       Table: db4
Create Table: CREATE TABLE `db4` (
  `name` varchar(20) NOT NULL COMMENT '这个是用户的用户名',
  `age` tinyint DEFAULT '18' COMMENT '这个是用户的年龄',
  `sex` char(1) DEFAULT '男' COMMENT '这个是用户的性别'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

zerofill

刚开始学习数据库时,很多人对数字类型后面的长度很迷茫。通过show看看tt3表的建表语句:

mysql> show create table db5 \G
*************************** 1. row ***************************
       Table: db5
Create Table: CREATE TABLE `db5` (
  `a` int(10) unsigned NOT NULL,
  `b` int(10) unsigned NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

可以看到int(10),这个代表什么意思呢?整型不是4字节码?这个10又代表什么呢?其实没有zerofill这个属性,括号内的数字是毫无意义的。a和b列就是前面插入的数据,如下:

mysql> insert into db5 values(1,2);
Query OK, 1 row affected (0.00 sec)
mysql> select * from db5 ;
 +------+------+
 | a   | b   |
 +------+------+
 |    1 |    2 |
 +------+------+

但是对列添加了zerofill属性后,显示的结果就有所不同了。修改db5表的属性:

mysql> alter table db5 change a a int(5) unsigned zerofill;
mysql> show create table db5 \G
*************************** 1. row ***************************
       Table: db5
Create Table: CREATE TABLE `db5` (
 `a` int(5) unsigned zerofill DEFAULT NULL,  --具有了zerofill
 `b` int(10) unsigned DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

对a列添加了zerofill属性,再进行查找,返回如下结果:

mysql> select * from db5;
+-------+------+
| a     | b   |
+-------+------+
| 00001 |    2 |
+-------+------+

这次可以看到a的值由原来的1变成00001,这就是zerofill属性的作用,如果宽度小于设定的宽度(这里设置的是5),自动填充0。要注意的是,这只是最后显示的结果,在MySQL中实际存储的还是1。设置了zerofill属性后的一种格式化输出而已。就有点我们学习C语言的时候,我们使用printf(“%02d”,num)这种以0作为填充是类似的。

主键

主键:primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键;主键所在的列通常是整数类型。

案例:
创建表的时候直接在字段上指定主键

mysql> create table db7(
    -> id int unsigned primary key not null,
    -> name varchar(20) not null
    -> );
Query OK, 0 rows affected (0.04 sec)

mysql> desc db7;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int unsigned | NO   | PRI | NULL    |       |
| name  | varchar(20)  | NO   |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

如果对与id插入相同的数据就会报错

mysql> insert into db7 (id, name) values (1, '张三');
Query OK, 1 row affected (0.00 sec)

mysql> insert into db7 (id, name) values (1, '张三');
ERROR 1062 (23000): Duplicate entry '1' for key 'db7.PRIMARY'

mysql> insert into db7 (id, name) values (2, '张三');
Query OK, 1 row affected (0.00 sec)

mysql> select * from db7;
+----+--------+
| id | name   |
+----+--------+
|  1 | 张三   |
|  2 | 张三   |
+----+--------+
2 rows in set (0.01 sec)

设置好的主机主键也可以进行添加

mysql> alter table db7 drop primary key;
Query OK, 2 rows affected (0.06 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> desc db7;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int unsigned | NO   |     | NULL    |       |
| name  | varchar(20)  | NO   |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

如果在一开始创建表的时候没有设置主键的话,后序也可以进设置主键。

mysql> alter table db7 add primary key(id); # 这里要指定谁是主键
Query OK, 0 rows affected (0.07 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc db7;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int unsigned | NO   | PRI | NULL    |       |
| name  | varchar(20)  | NO   |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

复合主键

在创建表的时候,在所有字段之后,使用primary key(主键字段列表)来创建主键,如果有多个字段作为主键,可以使用复合主键。

mysql> create table db8(
    -> id int unsigned,
    -> name varchar(20),
    -> primary key(id, name)
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql> desc db8;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int unsigned | NO   | PRI | NULL    |       |
| name  | varchar(20)  | NO   | PRI | NULL    |       |
+-------+--------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

这里我们明白的是,这里没有违背主键只有一个的规则,是因为,这里id和name统称为一个主键,只有当id和name同时相同的时候才会触发主键不能重复的条件。

mysql> insert into db8 (id, name) values (1,'张三');
Query OK, 1 row affected (0.01 sec)

# 这里因为id和name同时和上面的相同了,所以报错了
mysql> insert into db8 (id, name) values (1,'张三');
ERROR 1062 (23000): Duplicate entry '1-张三' for key 'db8.PRIMARY'

mysql> insert into db8 (id, name) values (2,'张三');
Query OK, 1 row affected (0.01 sec)

mysql> select * from db8;
+----+--------+
| id | name   |
+----+--------+
|  1 | 张三   |
|  2 | 张三   |
+----+--------+
2 rows in set (0.00 sec)

自增长

auto_increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。
自增长的特点:

  • 任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)
  • 自增长字段必须是整数
  • 一张表最多只能有一个自增长

案例:

mysql> create table db9(
    -> id int unsigned primary key auto_increment,
    -> name varchar(20) not null
    -> );
Query OK, 0 rows affected (0.03 sec)

mysql> show create table db9 \G
*************************** 1. row ***************************
       Table: db9
Create Table: CREATE TABLE `db9` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

mysql> insert into db9 (name) values ('张三');
Query OK, 1 row affected (0.00 sec)

mysql> insert into db9 (name) values ('李四');
Query OK, 1 row affected (0.00 sec)

mysql> select * from db9;
+----+--------+
| id | name   |
+----+--------+
|  1 | 张三   |
|  2 | 李四   |
+----+--------+
2 rows in set (0.01 sec)

mysql> show create table db9 \G
*************************** 1. row ***************************
       Table: db9
Create Table: CREATE TABLE `db9` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci # 这里我们会发现有一个字段AUTO_INCREMENT=3也就是存放下一个值的序号
1 row in set (0.00 sec)

如果我们一开始就插入了我们设定好的id,这个自增长还会从1开始增长吗?

mysql> create table db9(
    -> id int unsigned primary key auto_increment,
    -> name varchar(20) not null
    -> );
Query OK, 0 rows affected (0.03 sec)

mysql> show create table db10 \G
*************************** 1. row ***************************
       Table: db10
Create Table: CREATE TABLE `db10` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci #这里会发现AUTO_INCREMENT=11
1 row in set (0.00 sec)

mysql> insert into db10 (name) values ('李四');
Query OK, 1 row affected (0.01 sec)

mysql> select * from db10;
+----+--------+
| id | name   |
+----+--------+
| 10 | 张三   |
| 11 | 李四   |
+----+--------+
2 rows in set (0.00 sec)

从上面我们观察到的现象就是,我们一开是插入了10,并且看来表结构发现AUTO_INCREMENT=11,而后来又插入了一个数据,这次插入的数据没有带id,而自增长就开始从11,开始了。那么如果我们一开始就定义好了AUTO_INCREMENT会怎么样呢?

mysql> create table db11(
    -> id int unsigned auto_increment,
    -> name varchar(20)
    -> )auto_increment=10;

mysql> show create table db11 \G
*************************** 1. row ***************************
       Table: db11
Create Table: CREATE TABLE `db11` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

mysql> insert into db11 (name) values ('张三');
Query OK, 1 row affected (0.00 sec)

mysql> select * from db11;
+----+--------+
| id | name   |
+----+--------+
| 10 | 张三   |
+----+--------+
1 row in set (0.00 sec)

从上面我们不难看出,一旦我们手动的设置了auto_increment的值的话,他就会从我们设置的auto_increment值开始自增长,如果我们没有设置,让就会从default默认开始自增长。而一旦我们在中途手动的插入了自增长中的值的话,自增长同样也会从我们插入的值+1开始自增长。

自增长一定要与主键大搭配。

mysql> create table db12(
    -> id int unsigned auto_increment,
    -> name varchar(20)
    -> )auto_increment=10;
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key

索引

  • 在建立数据库存放数据的时候,如果数据很多的话,一旦我们需要查询某些数据时,可能效率会很低,而索引可以起到提高查询效率的作用。就比如,我们买的一本书,如果没有目录的话,我们想要查询一个章节就需要一页一页的翻查,这样效率是很低的,所有一旦有了目录我们只需要查看目录就可以直接定位到指定的页数,这样就可以大大提高效率了。而索引就类似于目录,可以定位到需要查询的位置。但是索引也是数据,那么也必定会占去一定的空间,所以索引的创建是一种以空间换时间的做法。

  • 在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。

  • 索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。数据库使用索引以找到特定值,然后顺指针找到包含该值的行。这样可以使对应于表的SQL语句执行得更快,可快速访问数据库表中的特定信息。

唯一键

一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键:唯一键就可以解决表中有多个字段需要唯一性约束的问题。
唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。

关于唯一键和主键的区别:
我们可以简单理解成,主键更多的是标识唯一性的。而唯一键更多的是保证在业务上,不要和别的信息出现重复。就比如我们标识一个人从信息,虽然可以使用身份证作为主键标识唯一,但是并且代表其他信息不需要唯一性了,比如电话号码,邮箱等,都需要保证唯一性。

mysql> create table db12(
    -> id int unsigned primary key,
    -> name varchar(20),
    -> mail varchar(20) unique key
    -> );
Query OK, 0 rows affected (0.04 sec)

mysql> insert into db12 (id,name,mail) values (1,'张三','1234');
Query OK, 1 row affected (0.01 sec)

mysql> insert into db12 (id,name,mail) values (2,'李四',NULL);
Query OK, 1 row affected (0.00 sec)

mysql> insert into db12 (id,name,mail) values (3,'王五',NULL);
Query OK, 1 row affected (0.00 sec)

mysql> insert into db12 (id,name,mail) values (4,'赵六','1234');
ERROR 1062 (23000): Duplicate entry '1234' for key 'db12.mail'
mysql> select * from db12;
+----+--------+------+
| id | name   | mail |
+----+--------+------+
|  1 | 张三   | 1234 |
|  2 | 李四   | NULL |
|  3 | 王五   | NULL |
+----+--------+------+
3 rows in set (0.00 sec)

外键

外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。
语法:

foreign key (字段名) references 主表() 

在这里插入图片描述

创建学生表

mysql> create table db13(
    -> id int unsigned primary key,
    -> name varchar(20) not null,
    -> class_id int not null
    -> );
    mysql> desc sut;
+----------+--------------+------+-----+---------+-------+
| Field    | Type         | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| id       | int unsigned | NO   | PRI | NULL    |       |
| name     | varchar(20)  | NO   |     | NULL    |       |
| class_id | int          | NO   |     | NULL    |       |
+----------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

创建班级表

mysql> create table class(
    -> id int not null,
    -> name varchar(20)
    -> );
mysql> desc class;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | NO   |     | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

向学生表和班级表插入一些数据

mysql> insert into class (id,name) values(1,'C++大牛班');
Query OK, 1 row affected (0.00 sec)

mysql> insert into class (id,name) values(2,'jav大.神班')
Query OK, 1 row affected (0.00 sec)

mysql> select * from class;
+----+--------------+
| id | name         |
+----+--------------+
|  1 | C++大牛班    |
|  2 | jav大神班    |
+----+--------------+
2 rows in set (0.00 sec)

mysql> insert into sut (id, name, class_id) values(1,'张三',1);
Query OK, 1 row affected (0.01 sec)

mysql> insert into sut (id, name, class_id) values(2,'李四',1);
Query OK, 1 row affected (0.00 sec)

mysql> insert into sut (id, name, class_id) values(3,'王五',2);
Query OK, 1 row affected (0.00 sec)

mysql> insert into sut (id, name, class_id) values(4,'找刘',3);
Query OK, 1 row affected (0.00 sec)

mysql> select * from sut;
+----+--------+----------+
| id | name   | class_id |
+----+--------+----------+
|  1 | 张三   |        1 |
|  2 | 李四   |        1 |
|  3 | 王五   |        2 |
|  4 | 找刘   |        3 |
+----+--------+----------+
4 rows in set (0.00 sec)

但是这里问题就来了,因为学生表中class_id是需要参照课程表中的id的,而学生表中的插入了找刘的class_id确实3,这个数字是班级表中没有的。

mysql> delete from class where id=1;
Query OK, 1 row affected (0.00 sec)

mysql> select * from class;
+----+--------------+
| id | name         |
+----+--------------+
|  2 | jav大神班    |
+----+--------------+
1 row in set (0.00 sec)

并且这里我还删除了class表中的id为1的课程,但是学生表中class_id等于1的学生还存在,这里同样也出现了问题提。综上所述就是,如果没有特定的约束的话,可能会添加到没有的课程,并且在删除的时候同样也可能会将还存在的课程进行删除,导致后序在查找的时候出现错误,所以这里需要在学生表中的class_id添加外键约束。

mysql> create table sut(
    -> id int unsigned primary key,
    -> name varchar(20) not null,
    -> class_id int not null,
    -> foreign key(class_id) references class(id)
    -> );
 
 mysql> desc sut;
+----------+--------------+------+-----+---------+-------+
| Field    | Type         | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| id       | int unsigned | NO   | PRI | NULL    |       |
| name     | varchar(20)  | NO   |     | NULL    |       |
| class_id | int          | NO   | MUL | NULL    |       |
+----------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

mysql> insert into sut (id, name, class_id) values(4,'找刘',3);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test_db`.`sut`, CONSTRAINT `sut_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `class` (`id`))

mysql> delete from class where id=1;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test_db`.`sut`, CONSTRAINT `sut_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `class` (`id`))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三问走天下

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值