一、什么是约束
为了保证数据的一致性和完整性,SQL规范以约 束的方式对表数据进行额外的条件限制。
• 约束是表级的强制规定
• 可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE 语句)
二、常见约束
有以下六种约束:
– NOT NULL 非空约束,规定某个字段不能为空
– UNIQUE 唯一约束,规定某个字段在整个表中是唯一的
– PRIMARY KEY 主键(非空且唯一)
– FOREIGN KEY 外键
– CHECK 检查约束
– DEFAULT 默认值
注意: MySQL不支持check约束,但可以使用check约束,没有任何效果。
根据约束数据列的限制,约束可分为:
– 单列约束:每个约束只约束一列
– 多列约束:每个约束可约束多列数据
•根据约束的作用范围,约束可分为:
– 列级约束只能作用在一个列上,跟在列的定义后面
– 表级约束可以作用在多个列上,不与列一起,而是单独定义
常见约束
一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性
CREATE TABLE 表名(
字段名 字段类型 约束
)
分类
六大约束
NOT NULL 非空约束 保证该字段的值不能为空
比如姓名 学号
DEFAULT 默认约束 用于保证该字段有默认值
比如性别
PRIMARY KEY 主键约束 用于保证该字段的值具有非空 唯一性
比如学号
UNIQUE :唯一,用于保证该字段的值具有唯一性,可以为空
比如座位号 也可以为空
CHECK 检查约束 MySQL中不支持,虽然语法没错
性别只能是男或者女 那么添加的数据只能是二者之一 不然无法添加
FOREIGN KEY 外键约束 用于限制两个表的关系,用于保证该字段的值必须来自于
主表关联列的值
比如
表一:学生信息表里有一个专业列
表二:专业信息表 假如只有两个专业 1 Java 2 h5
那么表一中的专业列号只能是1或者2,来自于专业信息表
这个约束就叫做外键约束,一般添加在从表(学生信息表)中,
引用主表(专业信息表)中某列的值。
比如:专业编号,员工表的部门编号,工种编号,都可添加外键约束。
添加约束时机:
1.创建表时
2.修改表时
约束的添加分类:
1.列级约束
创建表时,写在:
字段名 字段类型 列级约束;
六大约束语法上都没问题,但外键约束无效果
2.表级约束
在写完列后,最后加上:
表级约束
不支持非空和默认
三、创建表时添加列级约束
1.添加列级约束
CREATE TABLE stuinfo(
id INT PRIMARY KEY,
stuName VARCHAR(20) NOT NULL,
gender CHAR(1) CHECK(gender = '男' OR gender = '女'),
seat INT UNIQUE,
age INT DEFAULT 18,
majorId INT REFERENCES major(id)
);
CREATE TABLE major(
id INT PRIMARY KEY,
majorName VARCHAR(20)
);
SELECT * FROM stuinfo;
语法:直接在字段名和类型后面追加约束类型即可。
只支持默认 非空 主键和唯一
四、创建表时添加表级约束
2.添加表级约束
DROP TABLE IF EXISTS stuinfo;
VARCHAR:可变长 CHAR:定长
CREATE TABLE stuinfo(
id INT,
stuname VARCHAR(20),
gender CHAR(1),
seat INT,
age INT,
majorid INT,
CONSTRAINT pk PRIMARY KEY(id),#主键
CONSTRAINT uq UNIQUE(seat),
CONSTRAINT ck CHECK(gender = '男' OR gender = '女'),
CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)
)
SHOW INDEX FROM stuinfo;
语法:
【constraint 约束名】
通用写法:
CREATE TABLE IF EXISTS stuinfo(
id INT PRIMARY KEY,
stuName VARCHAR(20) NOT NULL,
gender CHAR(1),
seat INT UNIQUE,
age INT DEFAULT 18,
majorId INT,
CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorId) REFERENCES major(id)
)
五、主键和唯一的对比
1、都可保证唯一性
2、主键不允许为空
3、主键在一个表中至多有一个,而唯一可以有多个
4、都允许组合,但不推荐
比如说一个学生表,含有学号,学号就是主键。
每个优秀的学生可以分配一对一导师。
还有一栏为导师ID
拥有导师的学生则有导师ID,且互不相同;
当然有些学生也可以没有导师ID
六、外键
1、要求在从表设置外键关系
2、从表的外键列的类型和主表的关联列的类型要求一致
3、主表的关联列必须是一个key 一般是主键或唯一
4、插入数据时,先插入主表,再插入从表
5、删除数据时,先删除从表,再删除主表