约束
作用:对表中的数据进行限定,保证数据的正确性、有效性、完整性!
约束分类:
约束 | 说明 |
---|---|
PRIMARY KEY | 主键约束 |
PRIMARY KEY AUTO_INCREMENT | 主键、自动增长 |
UNIQUE | 唯一约束 |
NOT NULL | 非空约束 |
FOREIGN KEY | 外键约束 |
FOREIGN KEY ON UPDATE CASCADE | 外键级联更新 |
FOREIGN KEY ON DELETE CASCADE | 外键级联删除 |
主键约束:
特点:
- 主键约束包含:
非空
和唯一
两个功能- 一张表只能有一个列作为主键
- 主键一般用于表中数据的唯一标识
语法:
含义 | SQL语句 |
---|---|
在创建表的时候给字段添加主键 | 字段名 字段类型 PRIMARY KEY |
在已有表中添加主键 | ALTER TABLE 表名 ADD PRIMARY KEY(字段名); |
删除主键 | ALTER TABLE 表名 DROP PRIMARY KEY; |
主键⾃增 | 字段名 字段类型 PRIMARY KEY AUTO_INCREMENT |
修改自增起始值 | ALTER TABLE 表名 AUTO_INCREMENT=起始值; |
演示:
-- 标准语法
CREATE TABLE 表名(列名 数据类型 PRIMARY KEY,列名 数据类型,...
);-- 创建学生表,并加主键
CREATE TABLE student(id INT PRIMARY KEY,-- id是主键NAME VARCHAR(30),age TINYINT
);-- 查询学生表详细信息
DESC student;-- 添加数据
INSERT INTO student VALUES(NULL,'韩信',99); -- 不能为空
INSERT INTO student VALUES(1,'韩信',99);-- 不能重复
INSERT INTO student VALUES(1,'露娜',98);
INSERT INTO student VALUES(2,'李白',97);-- 删除主键
ALTER TABLE student DROP PRIMARY KEY;-- 建表以后单独添加主键
ALTER TABLE student MODIFY id INT PRIMARY KEY;
主键自增:
- Mysql中的自增约束,必须配合键的约束一起用
- 如果删除某一行数据再添加一行,那id就会再删除的id的基础上加1
-- 建表时添加主键自增约束
CREATE TABLE student(id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(30),age TINYINT
);-- 添加数据
INSERT INTO student VALUES (NULL,'韩信',99);
INSERT INTO student VALUES (NULL,'李白',98);-- 删除主键自增约束
ALTER TABLE student MODIFY id INT;-- 建表后单独添加主键自增约束
ALTER TABLE student MODIFY id INT AUTO_INCREMENT;
唯一约束 | 作用:使这个字段的值不能够重复 |
---|---|
唯一约束的格式 | CREATE TABLE 表名 (字段名 字段类型, 字段名 字段类型 UNIQUE ); |
非空约束 | CREATE TABLE 表名 (字段名 字段类型,字段名 字段类 NOT NULL, ); |
默认值 | 作用:如果这个字段不设置值,就使用默认值。 |
默认值的格式 | CREATE TABLE 表名 (字段名 字段类型, DEFAULT 默认值); |
唯一约束:
唯一约束就是不让值重复,使用关键字
UNIQUE
-- 唯一约束 标准语法
CREATE TABLE 表名(列名 数据类型 UNIQUE,列名 数据类型,...
);-- 建表时添加唯一约束
CREATE TABLE student(id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(30),age TINYINT UNIQUE
);-- 添加数据
INSERT INTO student VALUES (NULL,'韩信',99);
INSERT INTO student VALUES (NULL,'李白',99);-- 删除唯一约束
ALTER TABLE student DROP INDEX age;-- 建表后添加唯一约束,如果要约束的列已经有重复数据是添加不了的
ALTER TABLE student MODIFY age INT UNIQUE;
非空约束:
-- 非空约束标准语法
CREATE TABLE 表名(列名 数据类型 NOT NULL,列名 数据类型,...
);-- 创建表时添加非空约束
CREATE TABLE student(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20) NOT NULL, -- 给name添加非空约束age INT UNIQUE
);-- 添加数据
INSERT INTO student VALUES (NULL,'韩信',99),(NULL,'李白',98);-- 删除非空约束
ALTER TABLE student MODIFY name VARCHAR(20);-- 创建表后单独添加非空约束,如果有已经存在的null值会提醒,但不报错,原来的null值会变空
ALTER TABLE student MODIFY name VARCHAR(20) NOT NULL;
外键约束:
- 一个表中的某个字段引用其他表的主键,这个字段称为外键
主表:
主键所在的表,约束别人的表,将数据给别人用副表/从表:
外键所在的表,被约束的表,使用别人的数据
作用:
作用就是让表和表之间产生关系,保证数据的准确性
为什么有外键约束:
表和表之间的数据有关联的时候,没有相关的数据约束无法保证数据的准确性!
什么时候用?
表和表之间有关联的时候呗,比如是用户和订单两个表之间
- 当我们在employee的dep_id里面输入不存在的部门,数据依然可以添加.但是并没有对应的部门,不能出现这种情况。employee的dep_id中的内容只能是department表中存在的id
需要达到目的
:需要约束dep_id只能是department表中已经存在id
解决方式
:使用外键约束
-- 创建表的时候添加外键约束
-- 格式 CONSTRAINT 外键名 FOREIGN KEY (本表外键列名) REFERENCES 主表名(主表主键列名)
-- 创建用户和订单表
CREATE TABLE user(id INT PRIMARY KEY AUTO_INCREMENT, -- idNAME VARCHAR(20) NOT NULL -- 姓名
);-- 创建orderlist订单表
CREATE TABLE orderlist(id INT PRIMARY KEY AUTO_INCREMENT, -- idnumber VARCHAR(20) NOT NULL, -- 订单编号uid INT, -- 订单所属用户CONSTRAINT ou_wjys FOREIGN KEY (uid) REFERENCES USER(id)
);-- 添加USER表数据
INSERT INTO USER VALUES (NULL,'韩信'),(NULL,'李白'),(NULL,'露娜');-- 添加orderlist表数据
INSERT INTO orderlist VALUES
(NULL,'001',1),(NULL,'001',1),
(NULL,'002',2),(NULL,'002',2),
(NULL,'003',3),(NULL,'003',3);-- 查询数据
SELECT * FROM USER;
SELECT * FROM orderlist;-- 查询表结构
DESC USER;
DESC orderlist;-- 删除外键
ALTER TABLE orderlist DROP FOREIGN KEY ou_wjys;-- 创建表后单独添加外键约束
ALTER TABLE orderlist ADD CONSTRAINT ou_wjys FOREIGN KEY (uid) REFERENCES USER(id);
外键级联更新和级联删除:
什么是级联更新和级联删除
把user用户表中的某个用户删,该用户所有的订单也随之被删除
把user用户表中的某个用户id修改,订单表中该用户所属的订单用户编号也随之修改
语法格式:
级联更新:
ON UPDATE CASCADE
级联删除:ON DELETE CASCADE
级联更新和级联删除:ON UPDATE CASCADE ON DELETE CASCADE
-- 添加级联更新
ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (本表外键列名) REFERENCES 主表名(主键列名) ON UPDATE CASCADE;
-- 添加级联删除
ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (本表外键列名) REFERENCES 主表名(主键列名) ON DELETE CASCADE;
-- 添加级联更新和级联删除
ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (本表外键列名) REFERENCES 主表名(主键列名) ON UPDATE CASCADE ON DELETE CASCADE;
演示:
-- 添加级联更新和级联删除
ALTER TABLE orderlist ADD CONSTRAINT ou_wjys FOREIGN KEY (uid) REFERENCES USER(id) ON UPDATE CASCADE ON DELETE CASCADE; -- 将韩信这个用户的id改为9
UPDATE USER SET id = 9 WHERE id = 1 ;-- 将韩信这个用户删除
DELETE FROM USER WHERE id = 9;