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 分钟前
Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解
后端·sql·mysql
Channing Lewis1 小时前
sql server如何创建表导入excel的数据
数据库·oracle·excel
秃头摸鱼侠1 小时前
MySQL安装与配置
数据库·mysql·adb
UGOTNOSHOT1 小时前
每日八股文6.3
数据库·sql
行云流水行云流水1 小时前
数据库、数据仓库、数据中台、数据湖相关概念
数据库·数据仓库
John Song1 小时前
Redis 集群批量删除key报错 CROSSSLOT Keys in request don‘t hash to the same slot
数据库·redis·哈希算法
IvanCodes2 小时前
七、Sqoop Job:简化与自动化数据迁移任务及免密执行
大数据·数据库·hadoop·sqoop
tonexuan2 小时前
MySQL 8.0 绿色版安装和配置过程
数据库·mysql
JohnYan2 小时前
工作笔记- 记一次MySQL数据移植表空间错误排除
数据库·后端·mysql
我最厉害。,。2 小时前
Windows权限提升篇&数据库篇&MYSQL&MSSQL&ORACLE&自动化项目
数据库·mysql·sqlserver