【MySQL】:MySQL中四大约束
目录
所有的关系型数据库都支持对数据表使用约束,在表上强制执行数据校验,保证数据的完整性。
MySQL数据库支持以下四种约束形式:
非空约束 NOT NULL
所有数值类型的值都可以为null。
空字符串和0都不等于null。
-- 头铁之后的报错信息:Column 'name' cannot be null -- 1、创建表时添加约束 CREATE TABLE stu( id INT, NAME VARCHAR(20) NOT NULL ); SELECT * FROM stu; -- 2、表创建完毕之后,追加约束 ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL; -- 3、 删除name的非空约束 ALTER TABLE stu MODIFY NAME VARCHAR(20);
唯一约束 UNIQUE
保证指定的列不允许出现重复值,但是可以存在多个null值。
-- 头铁之后的报错信息:Duplicate entry '1' for key 'phone_number' -- 1、创建表时添加约束 CREATE TABLE stu( id INT, phone_number VARCHAR(20) UNIQUE ); -- mySql中,唯一约束限定的列可以有多个null -- 2、建表后追加唯一约束 ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE; -- 3、删除唯一约束 ALTER TABLE stu DROP INDEX phone_number;
主键约束 PRIMARY KEY
主键约束的功能相当于非空+唯一约束,既不允许出现重复,也不允许出现null。
每个表中最多允许有一个主键,唯一确定一行记录的字段。
-- 头铁之后的报错信息:Duplicate entry '1' for key 'PRIMARY' -- 1、创建表时,添加主键约束 CREATE TABLE student( id INT PRIMARY KEY, NAME VARCHAR(20) ); SELECT * FROM student; -- 2、建表后,追加主键 ALTER TABLE student MODIFY id INT PRIMARY KEY; -- 3、删除主键 ALTER TABLE student DROP PRIMARY KEY;
配合主键的自动增长
-- 自动增长,建议配合int类型的主键(如果不指定值,当前值为上一值加一) CREATE TABLE student( id INT PRIMARY KEY AUTO_INCREMENT, phone_number VARCHAR(20) ); -- 创建表之后,追加自动增长 ALTER TABLE student MODIFY id INT AUTO_INCREMENT; -- 删除自动增长 ALTER TABLE student MODIFY id INT;
外键约束 FOREIGN KEY
外键约束用以通知数据库与表字段之间的对应关系,以维护数据的完整性。
-- 首先创建不含外键约束的“一对多”关系的两张表 CREATE TABLE dept( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20) ); INSERT INTO dept VALUES (NULL,'法师'),(NULL,'坦克'),(NULL,'剑客'),(NULL,'战士'); CREATE TABLE emp( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20), dept_id INT ); INSERT INTO emp VALUES (NULL,'佐伊',1),(NULL,'扎克',2),(NULL,'亚索',3),(NULL,'盖伦',4);
一对多的关系是,通过emp表中的dept_id字段关联到dept表中的id字段,这样我们一看到这个英雄是什么序号,就可以通过多表查询,得到这个英雄具体的职业是啥。
在没有添加外键约束的情况下,可能会出现以下几种不合理的情况:
-- 不合理情况1:可以任意插入英雄,选择不存在的职业 INSERT INTO emp VALUES(NULL,'艾希',5); -- 不合理情况2:在仍有英雄存在的情况下,删除这个职业 DELETE FROM dept WHERE id = 4;
很明显,都是非常无理取闹的请求,如何去解决呢,通过外键约束。
再来试着创建两个表,并且添加上外键约束:
-- 新建表,添加外键 CREATE TABLE dept( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20) ); INSERT INTO dept VALUES (NULL,'法师'),(NULL,'坦克'),(NULL,'剑客'),(NULL,'战士'); CREATE TABLE emp( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20), dept_id INT, -- 不是最后一行,注意加上逗号 FOREIGN KEY(dept_id) REFERENCES dept(id)-- 添加外键约束(emp中的dep_id字段依赖于dept表中的id字段) ); INSERT INTO emp VALUES (NULL,'佐伊',1),(NULL,'扎克',2),(NULL,'亚索',3),(NULL,'盖伦',4);
这个时候再搞一搞无理取闹的要求试试,这个时候就不可了,会报错呢。
-- Cannot add or update a child row: a foreign key constraint fails (xxx省略) -- Cannot delete or update a parent row: a foreign key constraint fails (xxx省略)
(ps:我发现数据库的报错信息都非常直接,每次都能一眼看出来错出在哪)
这时,如果想删除这个职业,也不是不可以,你需要把这个职业里面代表的英雄全给删咯,这样就可以删除职业了。
-- 1.需要先删除战士英雄,也就是dept_id = 4的记录 DELETE FROM emp WHERE dept_id = 4; -- 2.接着删除这个职业,成功删除 DELETE FROM dept WHERE id = 4;
当然,外键约束这玩意儿,其实还是蛮危险的,因为在数据量很大的情况下,由于错误设置外键,可能会导致很多数据进不了数据库,也有可能会导致很多功能难以扩展。
相关推荐
CoderToy 2020-11-16
bianruifeng 2020-11-16
云中舞步 2020-11-12
敏敏张 2020-11-11
暗夜之城 2020-11-11
好记忆也需烂 2020-11-11
Coder技术文摘 2020-09-29
huacuilaifa 2020-10-29
Gexrior 2020-10-22
lpfvip00 2020-10-07
云中舞步 2020-09-11
康慧欣 2020-09-10
emmm00 2020-11-17
王艺强 2020-11-17
ribavnu 2020-11-16
wangshuangbao 2020-11-13
苏康申 2020-11-13
vivenwan 2020-11-13