约束:顾名思义舒服,限制。是作用于表中字段上的规则,用于限制存储在表中的数据
目的:保证数据库中数据的正确性,有效性和完整性
约束 | 描述 | 关键字 |
非空约束 | 限制该字段的数据不能为null | NOT NULL |
唯一约束 | 保证该字段的所有数据都是唯一、不重复的(身份证,手机号) | UNIQUE |
主键约束 | 主键是一行数据的唯一标识,要求非空且唯一 | PRIMARY KEY |
默认约束 | 保存数据时,如果未指定该字段的值,则采用默认值 | DEFAULT |
检查约束 | 保证字段值满足某一个条件或多个条件 | CHECK |
外键约束 | 用来让两张表之间建立连接,保证数据的一致性和完整性 | FOREIGN KEY |
总之:约束是作用于表中的字段上的,可以在创建表或修改表的时候添加约束
示例:创建一个user表,满足以下条件
字段名 | 字段含义 | 字段类型 | 约束条件 | 约束关键字 |
id | ID唯一标识 | int | 主键,并且自动增长 | primary key auto_increment |
name | 姓名 | varchar(10) | 不为空,并且唯一 | not null unique |
age | 年龄 | int | 大于0,并且小于等于120 | check |
status | 状态 | char(1) | 如果没有指定该值,默认为1 | default |
gender | 性别 | char(1) | 无 |
create table user(
`id` int primary key AUTO_INCREMENT COMMENT '主键',
`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 '性别'
)COMMENT '用户表';
INSERT INTO user (name,age,status,gender) values ('Tom1',18,'1','女');
#不加status
INSERT INTO user (name,age,gender) values ('Tom2',18,'男');
#测试年龄
INSERT INTO user (name,age,gender) values ('Tom3',-1,'男');
INSERT INTO user (name,age,gender) values ('Tom4',121,'男');
1、先创建两张表
create table emp_new(
id int auto_increment comment 'id' primary key ,
name varchar(50) not null comment '姓名',
age int comment '年龄',
job varchar(20) comment '职位',
salary int comment '薪资',
enterdate date comment '入职时间',
managerid int comment '直属领导id',
dept_id int comment '部门id'
)comment '员工表';
insert into emp_new(id, name, age, job, salary, enterdate, managerid, dept_id)
VALUES (1,'金庸',66,'总裁',20000,'2000-01-01',null,5),
(2,'张无忌',20,'项目经理',12500,'2005-12-05',2,1),
(3,'杨逍',33,'开发',8400,'2000-11-03',2,1),
(4,'韦一笑',48,'开发',11000,'2002-02-05',2,1),
(5,'常遇春',43,'开发',10500,'2004-09-07',3,1),
(6,'小昭',19,'程序员鼓励师',6600,'2004-10-12',2,1);
create table dept(
id int auto_increment comment 'ID' primary key ,
name varchar(50) not null comment '部门名称'
)comment '部门表';
insert into dept (id, name) values(1,'研发部'),(2,'市场部'),(3,'财务部'),(4,'销售部'),(5,'总经办');
添加外键
#添加外键
#方式1:在创建表格的时候直接添加外键
create table 表名(
字段名 字段类型,
...
CONSTRAINT 外键名称 FOREIGN KEY(外键字段名) REFERENCES 主表(主表列名)
);
#方式2:表格已经创建好
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY(外键字段名) REFERENCES 主表(主表列名);
ALTER TABLE emp_new ADD CONSTRAINT fk_emp_dept_id FOREIGN key(dept_id) REFERENCES dept(id);
执行之后,我们在删除了部门表id的时候员工表就有了关系,就会报错
行为 | 说明 |
NO ACTION | 当父表中删除更新对于记录时,首先检查该记录是否有对应外键,如果有则不允许删除更新 |
RESTRICT | 当父表中删除更新对于记录时,首先检查该记录是否有对应外键,如果有则不允许删除更新(同上) |
CASCADE | 当父表中删除更新对于记录时,首先检查该记录是否有对应外键,如果有则也删除子表的记录 |
SET NULL | 当父表中删除更新对于记录时,首先检查该记录是否有对应外键,如果有子表中该外键值为null |
SET DEFAULT | 父表有变更时,子表将外键设为一个默认值(innodb不支持) |
记得先删除一下外键名称
ALTER TABLE emp_new DROP FOREIGN KEY fk_emp_dept_id;
#IN UPDATE CASCADE ON DELETE CASCADE;
ALTER TABLE emp_new ADD CONSTRAINT fk_emp_dept_id1 FOREIGN KEY(dept_id) REFERENCES dept(id) ON UPDATE CASCADE ON DELETE CASCADE;
DELETE from dept where id =1;
记得先删除一下外键名称
ALTER TABLE emp_new DROP FOREIGN KEY fk_emp_dept_id1;
ALTER TABLE emp_new ADD CONSTRAINT fk_emp_dept_id1 FOREIGN KEY(dept_id) REFERENCES dept(id) ON UPDATE SET NULL ON DELETE SET NULL;
DELETE from dept where id =1;