1. 含义
一种限制,用于限制表中的数据,为了保证表中数据的准确和可靠性
一般是在创建或修改表时添加约束(在数据添加之前)
2. 分类
- NOT NULL:保证该字段的值不为空
- DEFAULT:保证该字段的值有默认值
- PRIMARY KEY:保证该字段的值具有唯一性,并且非空
- UNIQUE:保证该字段的值具有唯一性,但是可以为空
- CHECK:检查约束,MySQL不支持
- FOREIGN KEY:外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值
列级的外键约束没有效果,表级的非空和默认约束不支持
3. 实例
创建表时添加列级约束
CREATE TABLE stu_info (
id INT PRIMARY KEY,
stu_name VARCHAR (20) NOT NULL,
gender CHAR(1) CHECK (gender = '男'
OR gender = '女'),
seat INT UNIQUE,
age INT DEFAULT 18,
major_id INT REFERENCES major (id)
) ;
CREATE TABLE major (
id INT PRIMARY KEY,
major_name VARCHAR (20) NOT NULL
) ;
创建表时添加表级约束
CREATE TABLE info (
id INT,
stu_name VARCHAR (20),
gender CHAR(1),
seat INT,
age INT,
major_id INT,
-- CONSTRAINT pk可以去掉
CONSTRAINT pk PRIMARY KEY (id),
CONSTRAINT uq UNIQUE (seat),
CONSTRAINT ck CHECK (gender = '男'
OR gender = '女'),
CONSTRAINT fk FOREIGN KEY (major_id) REFERENCES major (id)
) ;
修改表时添加约束
- 非空约束
ALTER TABLE `stu_info`
MODIFY COLUMN `stu_name` VARCHAR (20) NOT NULL ;
- 默认约束
ALTER TABLE `stu_info`
MODIFY COLUMN `age` INT DEFAULT 18 ;
- 主键约束
ALTER TABLE `stu_info`
MODIFY COLUMN `id` INT PRIMARY KEY ;
ALTER TABLE `stu_info`
ADD PRIMARY KEY (id) ;
- 唯一键约束
ALTER TABLE `stu_info`
MODIFY COLUMN `seat` INT UNIQUE ;
ALTER TABLE `stu_info`
ADD UNIQUE (`seat`) ;
- 外键约束
ALTER TABLE `stu_info`
ADD FOREIGN KEY (`major_id`) REFERENCES major (id);
修改表时删除约束
- 删除非空约束
ALTER TABLE `stu_info`
MODIFY COLUMN `stu_name` VARCHAR (20) ;
- 删除默认约束
ALTER TABLE `stu_info`
MODIFY COLUMN `age` INT ;
- 删除主键约束
ALTER TABLE `stu_info`
DROP PRIMARY KEY ;
- 删除唯一键约束
-- 查询出唯一键的key,再根据key进行删除
SHOW INDEX FROM `stu_info` ;
ALTER TABLE `stu_info`
DROP INDEX seat ;
- 删除外键约束
ALTER TABLE `stu_info`
DROP FOREIGN KEY major_id ;
4. 关于主键和唯一
保证唯一性 | 是否允许为空 | 一个表中可以有几个 | 是否允许组合(多个组成一个) | |
---|---|---|---|---|
主键 | Y | N | 至多有一个 | Y(不推荐) |
唯一 | Y | Y | 可以有多个 | Y(不推荐) |
5. 关于外键
- 要求在从表中设置外键关系
- 从表的外键列的类型和主表的关联列要求一致或兼容,名称无要求
- 要求主表中的关联列必须是一个key(一般是主键或唯一键)
- 插入数据时,要先插入主表的数据,再插入从表的数据;删除数据时,要先删除从表,再删除主表
- 设置级联删除(在删除主表中的数据时,从表中引用了主表中相关数据的数据也会被删除)
ALTER TABLE `beauty` ADD FOREIGN KEY (`boyfriend_id`) REFERENCES `boys` (`id`) ON DELETE CASCADE ;
- 设置级联置空(在删除主表中的数据时,从表中引用了主表中相关数据的数据会被置空)
ALTER TABLE `beauty` ADD FOREIGN KEY (`boyfriend_id`) REFERENCES `boys` (`id`) ON DELETE SET NULL ;
总结
一般能用列级约束的就先用列级约束,外键由于可以有多个,应该使用表级约束
列级约束不可以取约束名,表级约束可以
6. 标识列(自增长列)
可以不用手动的插入值,系统提供默认的序列值
创建表时设置标识列
CREATE TABLE au (
id INT PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR (20)
) ;
修改表时创建标识列
ALTER TABLE `au`
MODIFY COLUMN id INT PRIMARY KEY AUTO_INCREMENT ;
修改表时删除标识列
ALTER TABLE `au`
MODIFY COLUMN id INT ;
起始值和步长
- 查询出相关变量:auto_increment_increment(步长)和auto_increment_offset(起始位置),默认都是1
SHOW VARIABLES LIKE '%auto_incre%';
- 可以设置变量的值来改变效果但一般不做修改,但MySQL不支持修改 auto_increment_offset
SET auto_increment_increment = 3 ;
总结
标识列必须是一个key
一个表中有至多一个标识列
标识列的类型只能是数值型
标识列可以通过手动插入值来改变起始值