含义:一种限制,用于限制表中的数据,为了保证表中的数据的准确性和可靠性
分类:六大约束
- NOT NULL:非空约束,用于保证该字段的值不能为空
- DEFAULT:默认约束,用于保证该字段有默认值
- PRIMARY KEY:主键约束,用于保证该字段的值具有唯一性,并且非空
- UNIQUE:唯一约束,用于保证该字段的值具有唯一性,可以为空(如果是null,则可以为多个)
- CHECK:检查约束【MySQL中不支持】
- FOREIGN KEY: 外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值,在从表添加外键约束,用于引用主表中某列的值
添加约束的时机:
- 创建表时
- 修改表时
约束的添加分类
- 列级约束:六大约束语法上都支持,但外键约束没有效果
- 表级约束:除了非空、默认,其他的都支持
位置 支持的约束类型 是否可以起约束名 列级约束 列的后面 六大约束语法上都支持,但外键约束没有效果 不可以 表级约束 所有列的下面 除了非空、默认,其他的都支持 可以但对主键没有效果(constraint)
主键和唯一对比
保证唯一性 是否允许为空 一个表中可以由多少个 是否允许组合 主键 是 否 至多1个 是(组合主键) 唯一 是 是 可以由多个 是
外键的特点:
- 要求在从表设置外键关系
- 从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无所谓
- 主表的关联列必须是一个key(一般是主键或唯一)
- 插入数据时,先插入主表,在插入从表
- 删除数据时,先删除从表的,在删除主表的
一、创建表时添加列级约束
语法:
直接在字段名和类型后面添加约束类型即可(可以添加多个约束类型,用空格隔开即可)
例子:创建一个表
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 FOREIGN KEY REFERENCES major(id)#外键
);
CREATE TABLE major(
id INT PRIMARY KEY,
majorName VARCHAR(20)
),
二、创建表时添加表级约束
语法:
在各个字段的最下面
constraint 约束名 约束类型(字段名)
CREATE TABLE stuinfo2(
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_stuuinfo2_major FOREIGN KEY(majorId) REFERENCES major(id)#外键
);
不起约束名
CREATE TABLE stuinfo3(
id INT,
stuName 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)#外键
);
三、什么时候使用列级约束或表级约束
通用的写法:外键约束使用表级约束,其他五大约束使用列级约束
CREATE TABLE stuinfo4(
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,
CONSTRAINT fk_stuuinfo4_major FOREIGN KEY(majorId) REFERENCES major(id)#外键
);
联合主键
CREATE TABLE stuinfo4(
id INT ,
stuName VARCHAR(20) NOT NULL,
gender CHAR(1) CHECK(gender = '男' OR gender = '女'),
seat INT UNIQUE,
age INT DEFAULT 18,
majorId INT,
CONSTRAINT fk_stuuinfo4_major FOREIGN KEY(majorId) REFERENCES major(id)#外键
PRIMARY KEY(id,stuName)#这里id和sutName两个字段构成一个主键
);
四、修改表时添加或删除约束
语法:
1. 添加约束
① 添加列级约束
ALTER TABLE 表名 MODIFY COLUMN 列名 数值类型 新约束;
② 添加表级约束
ALTER TABLE 表名 ADD 【CONSTRAINT 约束名】 约束类型(字段名)【外键的引用】
2.删除约束
ALTER TABLE 表名 MODIFY COLUMN 列名 数值类型;
ALTER TABLE 表名 MODIFY COLUMN 列名 数值类型 NULL;
ALTER TABLE 表名 DROP 约束类型 字段名(主键的字段名可不写)
注意:删除主键得使用drop
注意,
添加主键约束有两种方式
- ALTER TABLE 表名 MODIFY COLUMN 列名 数值类型 PRIMARY KEY;
- ALTER TABLE 表名 ADD PRIMARY KEY(列名)
添加唯一约束也有两种方式
- ALTER TABLE 表名 MODIFY COLUMN 列名 数值类型 UNIQUE;
- ALTER TABLE 表名 ADD UNIQUE(列名)
添加外键约束
- ALTER TABLE 从表 ADD FOREIGN KEY(列名) REFERENCES 主表(列名)
五、标识列(自增长列)
- 标识列又称为自增长列
- 关键字:AUTO_INCREMNET
- 含义:可以不用手动的插入值,系统提供默认的序列值,从1开始,每次插入自增长1
- 特点:
- 标识列必须和key搭配
- 一个表中只能有一个标识列
- 标识列的类型只能是数值型
- 可以在修改表时设置标识列,跟前面在修改表时设置或添加约束一样的语法
- 可以在修改表时删除标识列,跟前面在修改表时删除约束一样的语法
例子:
CREATE TABLE tab_identity(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20)
)
使用 SHOW VARIABLES LIKE '%AUTO_INCREMENT%'
可以查看到与自增长类相关的两个属性
可以使用SET auto_increment_increment = 数值
来改变自增列的增长值,
也可以使用SET auto_increment_offset = 数值
来改变自增列的起始值,但是由于MySQL不支持修改 auto_increment_offset,所以修改之后并不会起作用,但是有一个小技巧可以修改起始值,即在第一次插入数据时插入你想要的起始值
六、外键的级联操作
1. 外键的级联删除
外键的级联删除:在删除主表中做为外键的字段的数据时,从表中引用主表的该字段的这个数据做为外键的那些数据也会被删除
要使用级联删除首先在设置外键时要多添加一个条件 ON DELETE CASCADE,添加后,在删除主表中作为外键的字段的数据就是级联删除了
ALTER TABLE 从表名 ADD CONSTRAINT 外键名 FOREIGN KEY(列名) REFERENCES 主表名(列名) ON DELETE CASCADE
2.外键的级联置空
外键的级联置空:在删除主表中做为外键的字段的数据时,从表中引用主表的该字段的这个数据做为外键的那些数据中对应的字段的值会被置为null
要使用级联删除首先在设置外键时要多添加一个条件 ON DELETE SET NULL,添加后,在删除主表中作为外键的字段的数据就是级联置空了
ALTER TABLE 从表名 ADD CONSTRAINT 外键名 FOREIGN KEY(列名) REFERENCES 主表名(列名) ON DELETE SET NULL