MYSQL--完整性约束

目录

约束

设置约束

方式一

推荐:方式二

删除约束

主键约束

自增列

[组合主键, 联合主键](#组合主键, 联合主键)

外键约束

给表添加外键约束

注意:


约束

概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。

目的:保证数据库中数据的正确、有效性和完整性。
注意:约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。

主键约束:唯一且不为null,每一张表只能有一个主键约束

唯一约束:唯一,每张表可以有多个唯一约束

非空约束:不能为null

默认值约束:给列设置默认值

外键约束:子表某列数据来源主表某列的数据

检查约束(check(8.0.16版本之后)):限定值的范围

设置约束

方式一

表已经创建好了,以修改表的方式来添加约束,如果表中的数据违背约束,添加失败

ALTER TABLE 表名 add 约束;

推荐:方式二

创建表的时候,就设置约束

举例:

创建学生表:id(唯一 不能为空),name(非空),sex(默认值 男),age,email(唯一)

(1)在列声明后写

create table tb_student(

id int primary key ,#priamry key 主键约束

name varchar(50) NOT NULL ,#NOT NULL 非空约束

sex varchar(10) default '男',#default 默认值约束

age int,

email varchar(100) unique #唯一约束

);

性别的默认值为男:

(2)另起一行写约束,非空,默认值不可以

班级表:id 主键,cname 班级名称 非空,loc 教室位置(唯一)

create table tb_class(

id int,

cname varchar(100) not null ,

loc varchar(100),

primary key (id),

unique (loc)

);

班级位置为唯一,故报错,无法添加:

删除约束

ALTER TABLE 表名 DROP 约束;
alter table student1 drop primary key ;

datagrip可以手动加约束或者修改约束,不通过命令行:

主键约束

表设计经验:

  1. 每张表都应该有一个主键
  2. 主键加在非业务数据上,主键不允许修改

create table tb_employee_job(

eid int,

job_id int,

primary key (eid,job_id)

);

自增列

自增列 默认开始值为:1,每次加1

auto_increment 自增列,每个表只能有一个,加在主键,唯一键
create table tb_class(

id int auto_increment,

cname varchar(100) not null ,

loc varchar(100),

primary key (id),

unique (loc)

);

不给id列赋值,默认值为1:

如果手动给自增列赋值,是否报错? 不报错 id:24 下一个自增列的值:25

组合主键, 联合主键

create table tb_employee_job(

eid int,

job_id int,

primary key (eid,job_id) #组合主键

);


insert into tb_employee_job values (1,1);

insert into tb_employee_job values (1,2);

insert into tb_employee_job values (2,1);

外键约束

外键约束: 对外键的一种约束, 外键的值只能来源于主表主键值,唯一键值

外键设计经验:

  1. 多对多的关系, 需要中间表存储外键
  2. 一对多,外键加在多的一方
  3. 一对一: 外键加在任何一方, 外键必须加唯一约束

主外键是构成表与表关联的唯一途径!

外键是另一张表的主键!例如员工表与部门表之间就存在关联关系,其中员工表中的部门编号字段就是外键,是相对部门表的外键。

我们来看一个例子:

左侧的emp表是员工表,里面存储员工的基本信息,包含员工的ID、姓名、年龄、职位、薪资、入职日期、上级主管ID、部门ID,在员工的信息中存储的是部门的ID dept_id,而这个部门的ID是关联的部门表dept的主键id,那emp表的dept_id就是外键,关联的是另一张表的主键。

注意:目前上述两张表,只是在逻辑上存在这样一层关系;在数据库层面,并未建立外键关联,所以是无法保证数据的一致性和完整性的。

外键: 一个列, 维护两张表的关系

举例:

班级表与学生表: 1: n 外键加在学生表: 班级id外键

create table tb_student(

id int primary key, #primary key 主键约束

name varchar(50) not null, # not null 非空约束

sex varchar(10) default '男', # default 值 默认值约束

age int,

email varchar(100) unique, # unique 唯一约束

cid int

);

给表添加外键约束

CREATE TABLE 表名 (

字段名 数据类型,

...

CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCES 主表 (主表列名)

);


create table tb_student(

id int primary key, #primary key 主键约束

name varchar(50) not null, # not null 非空约束

sex varchar(10) default '男', # default 值 默认值约束

age int,

email varchar(100) unique, # unique 唯一约束

cid int,

foreign key (cid) references tb_class(id) #外键约束 外键名默认

);

注意:

  1. 创建表顺序: 先主表(被引用表tb_class), 再子表(使用外键约束的表,tb_student)
  2. 删除表顺序: 先删除子表,再删除主表
  3. 在实际开发中, 一般很少使用外键约束, 外键有程序赋值
相关推荐
艺术留白11 分钟前
MokaTest使用篇-SQL接口
数据库·sql
卓怡学长23 分钟前
w180springboot基于Java的悠扬乐器管理
java·spring boot·mysql·spring·maven·intellij-idea
( •̀∀•́ )9201 小时前
MySQL 自动备份与恢复方案
数据库·mysql·oracle
这个DBA有点耶1 小时前
大事务的“事前预防”:监控、拦截、Kill,四层防线一次讲透
数据库·mysql·代码规范
tachibana22 小时前
RAGAS 指标解读
数据库·人工智能·算法·机器学习·架构·大模型·llm
mlidongfeng2 小时前
[AI][昇腾950]TA 学习
数据库·学习
bestsun9992 小时前
rac集群环境下配置JDBC
数据库
java_logo3 小时前
Docker 部署 FalkorDB:轻松搭建属性图数据库与知识图谱平台
数据库·docker·知识图谱·falkordb·轩辕镜像·falkordb部署教程·falkordb部署文档
小白说大模型3 小时前
Spring AI 框架中集成 MCP 的完整指南:从服务端到客户端的全流程实践
大数据·数据库·人工智能·安全·spring·chatgpt·开源
计算机魔术师3 小时前
第二届世界人形机器人运动会开幕:2056 台机器人齐聚“冰丝带“,666 支队伍竞技 51 赛项
数据库·人工智能·机器人