MySQL数据库-约束
约束
约束的概念和分类
约束的概念
对表中的数据进行限定,保证数据的正确性、有效性、完整性!
约束的分类
约束 | 说明 |
---|---|
PRIMARY KEY | 主键约束 |
PRIMARY KEY AUTO_INCREMENT | 主键、自动增长 |
UNIQUE | 唯一约束 |
NOT NULL | 非空约束 |
FOREIGN KEY | 外键约束 |
FOREIGN KEY ON UPDATE CASCADE | 外键级联更新 |
FOREIGN KEY ON DELETE CASCADE | 外键级联删除 |
主键约束
主键约束特点
主键约束包含:非空和唯一两个功能
一张表只能有一个列作为主键
主键一般用于表中数据的唯一标识
主键约束的使用方式
(1)建表时添加主键约束
CREATE TABLE 表名(
列名 数据类型 PRIMARY KEY,
......
列名 数据类型 约束
);
CREATE TABLE student(
id INT PRIMARY KEY,
NAME VARCHAR(30),
age INT
);
DESC student;
上述Null的那一列,在id行的值为“NO”,表示不能为空!在KEY的那一列的值为PRI表示主键。
(2)删除主键约束 (drop)
ALTER TABLE 表名 DROP PRIMARY KEY;
ALTER TABLE student DROP PRIMARY KEY;
(3)建表后单独添加主键约束 (modify)
ALTER TABLE 表名 MODIFY 列名 数据类型 PRIMARY KEY;
ALTER TABLE student MODIFY id INT PRIMARY KEY;
主键自增约束
MySQL中的自增约束,必须配合键的约束一起使用!
在 MySQL 中,当主键定义为自增长后,这个主键的值就不再需要用户输入数据了,而由数据库系统根据定义自动赋值。每增加一条记录,主键会自动以相同的步长进行增长。
使用方式
(1)建表时添加主键自增约束
CREATE TABLE student2(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(30),
age INT
);
(2)删除自动增长
ALTER TABLE student2 MODIFY id INT;
(3)建表后单独添加自动增长
ALTER TABLE student2 MODIFY id INT AUTO_INCREMENT;
使用主键自增约束有什么好处?
(1)如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。如果不是自增主键,那么可能会在中间插入,学过数据结构的同学都知道,在中间插入,B+树为了维持平衡,引起B+树的节点分裂。总的来说用自增主键是可以提高查询和插入的性能。
(2)在切换这段时间,如果你的系统对latency非常敏感,那么就不能这么简单的做了,可能需要重新备份数据库,由于笔者维护这个表是B端系统,且数据量级大概百万量级,这么搞是OK的。
(3)自增ID可以用来做分页优化。
主键自增约束的好处?https://cloud.tencent.com/developer/article/1462758
唯一约束 (unique)
(1)建表时添加唯一约束
CREATE TABLE student3(
id INT PRIMARY KEY AUTO_INCREMENT,
tel VARCHAR(20) UNIQUE -- 给tel列添加唯一约束
);
(2)删除唯一约束
ALTER TABLE student3 DROP INDEX tel;
(3)建表后单独添加唯一约束
ALTER TABLE student3 MODIFY tel VARCHAR(20) UNIQUE;
非空约束 (not null)
(1)建表时添加非空约束
CREATE TABLE student4(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20) NOT NULL -- 给name添加非空约束
);
(2)删除非空约束
ALTER TABLE student4 MODIFY NAME VARCHAR(20);
(3)建表后单独添加非空约束
ALTER TABLE student4 MODIFY NAME VARCHAR(20) NOT NULL;
外键约束
为什么要有外键约束?
当表与表之间有的数据有关联性的时候,如果没有相关的数据约束,就无法保证数据的准确性!
不妨举一个例子:
在订单表中的uid指的是用户表的id,如果没有外键约束,表中的数据可以随意的增删,但是这样子是不符合逻辑的!
例如:
我们在订单表中新加了一项数据,其uid为3,但是在用户表中并没有id为3的用户,所以数据非法!
在如:
我们将用户表中id为2的用户删除,但是在订单表中还存在uid为2的订单,显然是不合理的!
作用
让表与表之间产生关联关系,从而保证数据的准确性!
外键约束的使用方式
(1)建表时添加外键约束
CONSTRAINT 外键名 FOREIGN KEY (本表外键列名) REFERENCES 主表名(主表主键列名)
constraint - foreign key - references
这里的案例使用两个表:user表 与 orderlist
-- 创建user用户表
CREATE TABLE USER(
id INT PRIMARY KEY AUTO_INCREMENT, -- id
NAME VARCHAR(20) NOT NULL -- 姓名
);
-- 添加用户数据
INSERT INTO USER VALUES (NULL,'张三'),(NULL,'李四'),(NULL,'王五');
-- 创建orderlist订单表
CREATE TABLE orderlist(
id INT PRIMARY KEY AUTO_INCREMENT, -- id
number VARCHAR(20) NOT NULL, -- 订单编号
uid INT, -- 订单所属用户
CONSTRAINT ou_fk1 FOREIGN KEY (uid) REFERENCES USER(id) -- 添加外键约束
);
-- 添加订单数据
INSERT INTO orderlist VALUES (NULL,'hm001',1),(NULL,'hm002',1),
(NULL,'hm003',2),(NULL,'hm004',2),
(NULL,'hm005',3),(NULL,'hm006',3);
测试如下:
-- 添加一个订单,但是没有所属用户。无法添加
INSERT INTO orderlist VALUES (NULL,'hm007',8);
-- 删除王五这个用户,但是订单表中王五还有很多个订单呢。无法删除
DELETE FROM USER WHERE NAME='王五';
上述两行代码都会报错!
(2)删除外键约束
ALTER TABLE 表名 DROP FOREIGN KEY 外键名;
ALTER TABLE orderlist DROP FOREIGN KEY ou_fk1;
(3)建表后单独添加外键约束
ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (本表外键列名) REFERENCES 主表名(主键列名);
外键的级联更新和级联删除
什么是级联更新和级联删除?
当我想把user用户表中的某个用户删掉,我希望该用户所有的订单也随之被删除
当我想把user用户表中的某个用户id修改,我希望订单表中该用户所属的订单用户编号也随之修改
主表的数据进行修改时,从表中有关联的数据也会随之修改!
添加级联更新和级联删除
(1)添加外键约束,同时添加级联更新
ALTER TABLE 表名 ADD
CONSTRAINT 外键名 FOREIGN KEY (本表外键列名) REFERENCES 主表名(主键列名)
ON UPDATE CASCADE;
(2)添加外键约束,同时添加级联删除
ALTER TABLE 表名 ADD
CONSTRAINT 外键名 FOREIGN KEY (本表外键列名) REFERENCES 主表名(主键列名)
ON DELETE CASCADE;
(3)添加外键约束,同时添加级联更新和级联删除
ALTER TABLE 表名 ADD
CONSTRAINT 外键名 FOREIGN KEY (本表外键列名) REFERENCES 主表名(主键列名)
ON UPDATE CASCADE ON DELETE CASCADE;
ALTER TABLE orderlist ADD
CONSTRAINT ou_fk1 FOREIGN KEY (uid) REFERENCES USER(id)
ON UPDATE CASCADE ON DELETE CASCADE;