MySQL约束
- 约束:作用于表中字段上的规则,用于限制存储在表中的数据
| 约束类型 |
关键字 |
描述 |
| 主键约束 |
PRIMARY KEY |
确保表中每一行的值都是唯一的,且不允许为空。每个表只能有一个主键。 |
| 唯一约束 |
UNIQUE |
确保列中的值是唯一的,但允许有多个空值(NULL)。 |
| 外键约束 |
FOREIGN KEY |
用来让两张表之间的数据建立连接,确保数据的一致性和完整性。 |
| 非空约束 |
NOT NULL |
确保列中的值不能为NULL,即必须有值。 |
| 默认值约束 |
DEFAULT |
为列指定一个默认值,当插入数据时未明确指定该列的值时,自动使用默认值。 |
| 检查约束 |
CHECK |
用于限制列的值必须满足某个条件(MySQL 8.0.16及更高版本支持)。 |
-- 示例:
create table user(id int primary key auto_increment comment 'ID',
name varchar(10) not null unique comment '姓名',
age int check(age>0 && age<=120) comment '年龄',
status char(1) default '1' comment '状态',
gender char(1) comment '性别');
- auto_increment 和主键搭配的关键字,表示自增长自动生成一个唯一数值,确保每行都有一个唯一标识
示例:外键约束
-- 创建部门表
mysql> create table dept( id int primary key auto_increment comment 'ID', name varchar(10) not null comment '部门名称') comment '部门表';
INSERT INTO dept (name) VALUES
('市场部'),
('研发部'),
('财务部'),
('人力资源部'),
('客服部');
-- 创建员工表
mysql> create table emp(id int primary key auto_increment comment 'ID', name varchar(10) not null comment '姓名', age int check(age>0 && age<=120) comment
'年龄', job varchar(20) comment '职位', salary int comment '薪资', entrydate date comment '入职时间', manageid int comment '部门领导id', dept_id int comment '部门id') comment '员工表';
INSERT INTO emp (name, age, job, salary, entrydate, manageid, dept_id) VALUES
('张三', 28, '市场专员', 8000, '2022-01-15', 1, 1),
('李四', 32, '市场主管', 12000, '2020-05-20', NULL, 1),
('王五', 25, '研发工程师', 15000, '2021-03-10', 2, 2),
('赵六', 30, '高级研发工程师', 20000, '2019-07-05', NULL, 2),
('孙七', 27, '财务专员', 9000, '2022-06-18', 3, 3),
('周八', 35, '财务经理', 25000, '2018-09-12', NULL, 3),
('吴九', 24, '人事专员', 7500, '2023-02-28', 4, 4),
('郑十', 31, '人事经理', 18000, '2017-11-01', NULL, 4),
('钱伯', 26, '客服代表', 6000, '2024-04-10', 5, 5),
('孔仲', 33, '客服主管', 10000, '2020-08-15', NULL, 5),
('段郎', 29, '市场专员', 8500, '2023-01-20', 1, 1),
('沈姐', 34, '市场主管', 13000, '2019-06-05', NULL, 1),
('韩哥', 23, '研发工程师', 14000, '2022-07-10', 2, 2),
('杨姐', 36, '高级研发工程师', 21000, '2018-04-25', NULL, 2),
('徐叔', 28, '财务专员', 9500, '2021-05-15', 3, 3),
('陈姨', 37, '财务经理', 26000, '2016-10-08', NULL, 3),
('曹哥', 25, '人事专员', 7800, '2023-03-12', 4, 4),
('许姐', 32, '人事经理', 19000, '2017-12-20', NULL, 4),
('何伯', 27, '客服代表', 6500, '2024-05-05', 5, 5),
('吕仲', 35, '客服主管', 11000, '2020-09-30', NULL, 5),
('施郎', 24, '市场专员', 8200, '2022-02-18', 1, 1),
('冯姐', 30, '市场主管', 12500, '2018-03-01', NULL, 1);
-- 创建外键关键两张表
mysql> alter table emp add constraint fk_dept_id foreign key (dept_id) references dept (id);
外键约束的删除/更新行为
| 约束行为 |
说明 |
CASCADE |
级联操作:删除/更新父表的行时,子表的对应行也被删除/更新。 |
SET NULL |
置空:删除/更新父表的行时,子表的外键列会被设置为 NULL(需允许 NULL)。 |
SET DEFAULT |
置默认值:删除/更新父表的行时,子表的外键列会被设为默认值(innodb 目前 不支持)。 |
RESTRICT |
限制:如果子表中仍然有引用该行的记录,则不允许删除/更新父表的行(默认行为)。 |
NO ACTION |
无操作:与 RESTRICT 类似,但在某些 SQL 标准的事务中可能有不同的行为。 |