MySQL数据库-约束

约束

约束的概念和分类

约束的概念

约束的分类

主键约束

主键约束特点

主键约束的使用方式

主键自增约束

使用方式

使用主键自增约束有什么好处?

唯一约束 (unique)

非空约束 (not null)

外键约束

为什么要有外键约束?

作用

外键约束的使用方式

外键的级联更新和级联删除

什么是级联更新和级联删除?

添加级联更新和级联删除


约束

约束的概念和分类

约束的概念

对表中的数据进行限定,保证数据的正确性、有效性、完整性

约束的分类

约束说明
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可以用来做分页优化。

主键自增约束的好处?icon-default.png?t=M1FBhttps://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;
posted @ 2022-02-16 18:20  金鳞踏雨  阅读(11)  评论(0编辑  收藏  举报  来源