约束
*概念:
对表中的数据进行限定,保证数据的正确性、有效性和完整性。
*分类:
- 主键约束:primary key
- 非空约束:not null
- 唯一约束:unique
- 外键约束:foreign key
*主键约束: primary key
非空且唯一;
一张表只能有一个字段为主键;
主键就是表中记录的唯一标识
CREATE TABLE student(
id INT PRIMARY KEY, -- 给id 添加主键约束
NAME VARCHAR(20)
);
-- 删除主键
-- 错误 alter table student modify id int;
ALTER TABLE student DROP PRIMARY KEY;
-- 创建表后,添加主键
ALTER TABLE student MODIFY id INT PRIMARY KEY;
*主键约束之自动增长
如果某一列是数值类型,使用auto_increment 可以来完成值的自动增长。
CREATE TABLE student(
id INT PRIMARY KEY AUTO_INCREMENT, -- 给id 添加主键和自动增长
NAME VARCHAR(20)
);
-- 删除自动增长
ALTER TABLE student MODIFY id INT;
-- 创建表后,添加自动增长
ALTER TABLE student MODIFY id INT AUTO_INCREMENT;
*非空约束: not null
-- 创建表添加非空约束
CREATE TABLE student(
id INT,
NAME VARCHAR(20) NOT NULL -- name 非空
);
-- 删除name 的非空约束
ALTER TABLE student MODIFY NAME VARCHAR(20);
-- 创建表完,添加非空约束
ALTER TABLE student MODIFY NAME VARCHAR(20) NOT NULL;
*唯一约束: unique
CREATE TABLE student1(
id INT,
phone_number VARCHAR(20) UNIQUE -- 添加了唯一约束
);
-- 注意mysql中,唯一约束限定的列的值可以有多个null
-- 删除唯一约束
-- 错误 alter table student1 modify phone_number varchar(20);
ALTER TABLE student1 DROP INDEX phone_number;
-- 创建表之后,添加唯一约束
ALTER TABLE student1 MODIFY phone_number VARCHAR(20) UNIQUE;
*外键约束: foreign key
-- 语法
CREATE TABLE 表名(
...
外键列
CONSTRAINT 外键名称 FOREIGN KEY 外键列名称 REFERENCES 主表名称(主表列名称)
);
-- 创建部分表,主表
CREATE TABLE department(
id INT PRIMARY KEY AUTO_INCREMENT,
dep_name VARCHAR(20),
dep_location VARCHAR(20)
);
-- 从表
CREATE TABLE employee(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
age INT,
dep_id INT -- 外键对应主表的主键
CONSTRAINT emp_dept_fk FOREIGN KEY (dep_id) REFERENCES department(id)
);
-- 删除外键
ALTER TABLE employee DROP FOREIGN KEY emp_dept_fk;
-- 创建表后,添加外键
ALTER TABLE employee ADD CONSTRAINT emp_dept_fk FOREIGN KEY (dep_id) REFERENCES department(id);
*外键约束之级联
-- 语法
CREATE TABLE 表名(
...
外键列
CONSTRAINT 外键名称 FOREIGN KEY 外键列名称 REFERENCES 主表名称(主表列名称)
ON UPDATE CASCADE -- 级联更新
ON DELETE CASCADE -- 级联删除
);
-- 创建表后,添加外键,设置级联更新,设置级联删除
ALTER TABLE employee ADD CONSTRAINT emp_dept_fk FOREIGN KEY (dep_id)
REFERENCES department(id) ON UPDATE CASCADE ON DELETE CASCADE;