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、创建完成 

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,'男');

 

外键约束 

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

  

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;

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;

相关推荐

  1. MySql-约束

    2024-01-26 07:32:03       63 阅读
  2. MySQL-约束

    2024-01-26 07:32:03       51 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-26 07:32:03       91 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-26 07:32:03       97 阅读
  3. 在Django里面运行非项目文件

    2024-01-26 07:32:03       78 阅读
  4. Python语言-面向对象

    2024-01-26 07:32:03       88 阅读

热门阅读

  1. nrm-npm包版本管理和详细安装和使用教程

    2024-01-26 07:32:03       56 阅读
  2. 使用uniApp+vue3+Vite4+pinia+sass技术栈构建微信小程序

    2024-01-26 07:32:03       51 阅读
  3. SpringBoot ResponseBodyAdvice使用以及常见问题

    2024-01-26 07:32:03       50 阅读
  4. 前端学习之——react篇(条件渲染)

    2024-01-26 07:32:03       70 阅读
  5. Dockerr开发环境搭建

    2024-01-26 07:32:03       52 阅读
  6. 阿里云centos安装mysql,并修改初始密码

    2024-01-26 07:32:03       61 阅读
  7. SQL中的DML、DDL以及DCL是什么?

    2024-01-26 07:32:03       56 阅读
  8. 常用的gpt-4 prompt words收集7

    2024-01-26 07:32:03       54 阅读
  9. centos搭建离线仓库

    2024-01-26 07:32:03       54 阅读
  10. Git进阶

    2024-01-26 07:32:03       54 阅读