MySQL约束—— CONSTRAINT

约束:顾名思义舒服,限制。是作用于表中字段上的规则,用于限制存储在表中的数据

目的:保证数据库中数据的正确性,有效性和完整性

MySQL—约束
约束 描述 关键字
非空约束 限制该字段的数据不能为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)

1、写创建表格数据的sql语句

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 '用户表';

2、创建完成 

MySQL约束—— CONSTRAINT_第1张图片

3、测试插入数据:

3.1、插入数据

INSERT INTO user (name,age,status,gender) values ('Tom1',18,'1','女');

3.2、不设置status,可以发现直接默认是1

#不加status
INSERT INTO user (name,age,gender) values ('Tom2',18,'男');

 3.3、测试年龄,当插入年龄不在范围内直接报错

#测试年龄
INSERT INTO user (name,age,gender) values ('Tom3',-1,'男');
INSERT INTO user (name,age,gender) values ('Tom4',121,'男');

 MySQL约束—— CONSTRAINT_第2张图片

外键约束 

1、先创建两张表 

1.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);

 1.2、部门表

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,'总经办');

MySQL约束—— CONSTRAINT_第3张图片  MySQL约束—— CONSTRAINT_第4张图片

2、语法

添加外键

#添加外键
#方式1:在创建表格的时候直接添加外键
create table 表名(
字段名 字段类型,
...
CONSTRAINT 外键名称 FOREIGN KEY(外键字段名) REFERENCES 主表(主表列名)
);

#方式2:表格已经创建好
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY(外键字段名) REFERENCES 主表(主表列名);

2.1、外键名称叫做fk_emp_dept_id

ALTER TABLE emp_new ADD CONSTRAINT fk_emp_dept_id FOREIGN key(dept_id) REFERENCES dept(id);

执行之后,我们在删除了部门表id的时候员工表就有了关系,就会报错

2.2、解决这张错误:就是在删除主表的时候,子表/从表相关联的信息也会被删除

约束——删除/更新行为
行为 说明
NO ACTION 当父表中删除更新对于记录时,首先检查该记录是否有对应外键,如果有则不允许删除更新
RESTRICT 当父表中删除更新对于记录时,首先检查该记录是否有对应外键,如果有则不允许删除更新(同上)
CASCADE 当父表中删除更新对于记录时,首先检查该记录是否有对应外键,如果有则也删除子表的记录
SET NULL 当父表中删除更新对于记录时,首先检查该记录是否有对应外键,如果有子表中该外键值为null
SET DEFAULT 父表有变更时,子表将外键设为一个默认值(innodb不支持)

2.2.1、测试

 记得先删除一下外键名称

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;

MySQL约束—— CONSTRAINT_第5张图片

MySQL约束—— CONSTRAINT_第6张图片

2.2.2、测试SET NULL

 记得先删除一下外键名称

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;

MySQL约束—— CONSTRAINT_第7张图片

你可能感兴趣的:(mysql,数据库)