一、常见约束的分类
1.约束的含义:一种限制。用于限制表中数据,为了保证表中数据准确可靠。
2.六大约束
(1)NOT NULL:非空,用于保证该字段的值不能为空
(2)DEFAULT:默认,用于保证该字段有默认值
(3)PRIMARY KEY:主键,用于保证该字段值具有唯一性,并且非空
(4)UNIQUE:唯一、具有唯一性但可为空;比如:座位号
(5)CHECK:检查约束(MySQL中不支持)
(6) FOREIGN KEY:外键,用于限制两个表的关系,保证该字段的值必须来自主表的关联列的值
(在从表中添加外键约束,用于引用主表中某列的值)
Q1. 主键 vs 唯一:
是否唯一 | 是否允许为空 | 一张表中可以有多少个 | 是否可以组合 | |
---|---|---|---|---|
主键 | 唯一 | 不允许 | 至多1个 | 可以,但不推荐 |
主键 | 唯一 | 允许 | 可以多个 | 可以,但不推荐 |
Q2. 外键的特点:
1.要求在从表设置外键约束
2.从表外键列的类型和主表关联列的类型要求一致或兼容,名称无要求
3.主表关联列必须是一个key(主键或者唯一)
4.插入数据时,先插入主表,再插入从表;删除数据时,先删除从表,再剔除主表
3.约束的添加时机:
- 创建表时
- 修改表时
4.约束的添加分类:
- 列级约束:六大约束语法上都支持,但外键约束没有效果
- 表级约束:除了非空、默认,其他都支持
位置 | 支持的约束类型 | 是否可起约束名 | |
---|---|---|---|
列级约束 | 列的后面 | 语法都支持,外键没效果 | 不可以 |
表级约束 | 所有列下面 | 默认和非空都不支持,其他支持 | 可以,但主键没效果 |
CREATE TABLE 表名 (
字段名 字段类型 列级约束,
字段名 字段类型,
表级约束
);
二、创建表时添加约束
1.添加列级约束
CREATE TABLE students (
stu_id INT PRIMARY KEY,
stu_name VARCHAR(20) NOT NULL,
gender CHAR(1) CHECK(gender='男' or gender='女'),
seat INT UNIQUE,
age INT DEFAULT,
majorid INT [FOREIGN KEY] REFERENCES major(id)
);
2.添加表级约束
语法:[constraint 约束名] 约束类型 (字段名)
CREATE TABLE students (
stu_id INT ,
stu_name VARCHAR(20),
gender CHAR(1) ,
seat INT,
age INT,
majorid INT,
PRIMARY KEY(id),
UNIQUE(seat),
CHECK(gender='男' or gender='女'),
FOREIGN KEY(majorid) REFERENCES major(id)
);
三、修改表时添加约束
1.添加非空约束
ALTER TABLE students MODIFY column stu_name VARCHAR(20) NOT NULL;
2.添加默认约束
ALTER TABLE students MODIFY column age INT DEFAULT 18;
3.添加主键
ALTER TABLE students MODIFY column id INT PRIMARY KEY;
或者
ALTER TABLE students add PRIMARY KEY(id);
4.添加唯一(同3)
ALTER TABLE students MODIFY column seat INT UNIQUE;
或者
ALTER TABLE students add UNIQUE(seat);
5.添加外键
ALTER TABLE students ADD FOREIGN KEY(majorid) fk_students_major REFERENCES major(id);
四、修改表时删除约束
1.删除非空、默认约束
ALTER TABLE students DROP PRIMARY KEY;
ALTER TABLE students ;
2.删除主键、唯一、外键
ALTER TABLE students DROP PRIMARY KEY;
ALTER TABLE students DROP INDEX seat;
ALTER TABLE students DROP FOREIGN KEY fk_students_major;
【补充:标识列】
定义
标识列,又称自增长列,可以不用手动插入值,系统提供默认的序列值。
特点
- 标志列必须和key搭配,不一定是主键
- 一个表至多有1个标识列
- 标识列的类型只能是数值型
- 标识列可通过
set auto_increment_increment=k;
设置步长;可以通过手动插入值设置起始值
1.修改表时设置标识列
ALTER TABLE students MODIFY column id INT PRIMARY KEY AUTO_INCREMENT;
2.修改表时删除标识列
ALTER TABLE students MODIFY column id INT PRIMARY KEY;