MYSQL完整性约束
1.实体完整性
(1)主码(PRIMARY KEY)约束
主码约束是指在表中定义一个主码,它的值用于唯一标识表中的每一行数据。
若关系中的一个属性或属性组的值能够唯一地标识一个元组,且他的子集不能唯一的标识一个元组,则称这个属性或属性组做候选码。
候选码特性:
- 唯一性:唯一性是指候选码的值在任何时刻都能唯一标识关系中的一个元组。例如,在一个学生数据库中,学号可以唯一标识每个学生,无论数据库中有多少学生,他们的学号都是唯一的。
- 最小性:最小性要求候选码是唯一标识符的最小集合。如果从候选码中去掉任何一个属性,剩余的属性集合将无法保证唯一性。例如,在学生数据库中,如果去掉学号,仅用姓名来标识学生,可能会出现多个学生有相同的姓名,因此学号是必要且最小的标识符。
若一个关系(即数据表)中有多个候选码,则选定其中一个作为主码。
主码特性:
- 唯一性:主码的值在表中必须是唯一的,不能有重复。每个元组的主码值必须是唯一的,以确保能够唯一标识一个元组。
- 非空值:主码的字段不能为空。在关系数据库中,主码字段必须有一个具体的值,不能为NULL。
- 不变性:一旦主码被选定,其值在数据修改过程中不应发生变化。主码通常选择那些不会频繁变化的属性,如人的身份证号、产品的序列号等。
- 4选择标准:在选择主码时,应优先考虑那些能够唯一标识记录且不易重复的属性。例如,学生表中的学号、员工表中的员工编号等。
主码规则:1.一个表可以有多个候选码,但每个表只能定义一个主码;
2.主码值必须使用唯一标识符中的每一行,且不能为空。
(2)唯一性(UNIQUE)约束
唯一性约束用于指明基本表在某一列或多个列的组合上的取值唯一。
唯一键规则:1.每个表可以定义多个唯一键;
2.唯一性约束确保在某一列或多列的组合上不出现重复值。唯一键可为空,但是最 多只有一个出现空值。
(3)空(NULL)约束和非空(NOT NULL)约束
空约束是指默认情况下,字段的取值可以为空。
非空约束是指字段的取值不能为空。
*完体完整性要求每一行都具有一个非空且又不重复的字段值。完体完整性还可以通过唯一性约束和非空约束共同实现。
(4)自增(AUTO_INCREMENT)约束
自增约束要求数据库表的某个字段值依次递增,且不重复。
自增字段规则:
- 每张表只能定义一个自增型字段;
- 自增字段必须为数值型;
- 自增字段必须定义为键(主键、唯一键或者外码)。
2.参照完整性(表间规则)
参照完整性属于表间规则。对于永久关系的相关表,在更新、插入或删除记录时,如果只改其一不改其二,就会影响数据的完整性;例如修改父表中关键字值后,子表关键字值未做相应改变;删除父表的某记录后,子表的相应记录未删除,致使这些记录成为孤立记录;对于子表插入的记录,父表中没有相应关键字值的记录;等等。对于这些涉及表间数据的完整性,统称为参照完整性。
(1)外码(外键)
设F是基本关系R的一组属性,但不是关系R的主码。若F与基本关系S的主码相对应,则称F是基本关系R的外码。基本关系R为子表,也叫参照关系,S为父表,也称为参照关系。
外码规则:
- 一个表可以没有外码,一个表也可以看多个外码,含外码的表为子表。
- 父表和子表不是绝对的,而是相对的。
- 父表的主码和子表的外码必须定义在同一个城上。
- 外码和相应的主码可以不同名。
- 子表R和父表S不一定是不同的关系。
- 一个子表可以对应多个父表,一个父表也可以对应多个子表。
(2)参照完整性规则
若属性或属性组F是基本关系R的外码,它与基本关系S的主键相对应(基本关系R和S不一定是不同的关系),则对于R中的每个元组在F上的值:
- 取空值,表示不知道不清楚。
- 或者等于S关系(父表)中某个元组中的主键值(主码值)。
(3)外码(FOREIGN KEY)约束
参照完整性主要依赖外码约束实现,外码约束使用的关键字是FOREIGN KEY。
FOREIGN KEY 约束指定某一个列或一组列作为外码,也称为外键。一个表可以有多个外码,用于确保参照完整性。
创建外码之前,父表必须已经存在于数据库中,或者是当前正在创建的表。如果是后一种情况,则父表与子表是同一个表,这样的表称为自参照表,这种结构称为自参照完整型。
创建外码之前,必须为父表定义主键。
3.域完整性
域完整性是针对某一具体关系数据库的约束条件,它保证表中某些列不能输入无效的值。
域完整性指表中的列必须满足某种特定的数据类型约束。如数据类型、格式、值域范围、精度、是否允许空值等。
4.用户自定义的完整性
用户自定义完整性是针对某个特定关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求。主要包括非空约束、唯一约束、检查约束、主键约束、外键约束。
用户定义完整性可以涵盖完体完整性、域完整性、参照完整性等完整性类型。
MYSQL数据库表的创建
MYSQL数据库表的创建语法如下:
CREATE TABLE [IF NOT EXISTS] 表名(
字段名1 数据类型 [列级约束条件],
...
字段名n 数据类型 [列级约束条件],
[表级约束条件1],
...
[表级约束条件n]
)其他选择项(例如存储引擎、字符集等选项)
建表语法较多,分为指定表名、定义字段和指定选项三部分。
指定表名在CREATE TABLE后面指定表名,IF NOT EXISTS创建表前先判断表是否存在,不存在则创建,存在则不出创建。
定义字段放在小括号中,分为三部分:字段名、数据类型、约束,前二者必不可少,约束为可选。
约束(约束扩展)分为列级约束和表级约束,两者约束效果相同。列级约束直接跟在字段后面,表级约束是在所有字段结束后。
具体语法:列级约束——字段名 数据类型 [列级约束条件]
表级约束—— [CONSTRAINT 约束名]约束类型 (字段名1,[字段名2,...,字段名n])
指定选项该部分可以舍子存储引擎、默认字符集以及压缩类型。
具体语法:存储引擎 ——ENGINE(MySQL四种存储引擎的区别-CSDN博客)
默认字符集——DEFAULT CHARSET
压缩类型——PACK_KEYS(值可以为:0,1,DEFAULT)
例:在创建mybatis数据库中创建如下几张表格中表。
字段名 | 数据类型 | 长度 | 是否允许为空 | 约束 | 说明 |
---|---|---|---|---|---|
DId | CAHR | 3 | 否 | 主键 | 系号 |
DName | VARCHAR | 10 | 否 | 取唯一值 | 系名 |
DHeader | CHAR | 4 | 是 | 外码,引用教室表中的教师号 | 系主任 |
字段名 | 数据类型 | 长度 | 是否允许为空 | 约束 | 说明 |
---|---|---|---|---|---|
MId | CAHR | 3 | 否 | 主键 | 专业编号 |
MName | VARCHAR | 20 | 否 | 取唯一值 | 专业名称 |
MDept | CHAR | 4 | 是 | 外码,引用系部表中的系号 | 所属系部 |
字段名 | 数据类型 | 长度 | 是否允许为空 | 约束 | 说明 |
---|---|---|---|---|---|
TId | CAHR | 4 | 否 | 主键 | 教师号 |
TName | VARCHAR | 10 | 否 | 教师名 | |
TGender | ENUM('男','女') | 是 | 性别 | ||
TDept | CHAR | 3 | 是 | 外码,引用系部表中的系号 | 所在系部 |
TRank | ENUM('助教','教授' ,'讲师','副教授') | 是 | 职称 |
字段名 | 数据类型 | 长度 | 是否允许为空 | 约束 | 说明 |
---|---|---|---|---|---|
SId | CAHR | 4 | 否 | 主键 | 学号 |
SName | VARCHAR | 10 | 否 | 姓名 | |
SGender | ENUM('男','女') | 是 | 默认值为男 | 性别 | |
SBirth | DATE | 是 | 出生日期 | ||
SMajor | CHAR | 3 | 是 | 外码,引用专业表中的专业编号 | 所属专业 |
字段名 | 数据类型 | 长度 | 是否允许为空 | 约束 | 说明 |
---|---|---|---|---|---|
CId | CAHR | 3 | 否 | 主键 | 课程号 |
CName | VARCHAR | 20 | 否 | 课程名 | |
CCredit | INT | 是 | 学分 | ||
CLimit | INT | 是 | 默认值为60 | 限制选人 |
字段名 | 数据类型 | 长度 | 是否允许为空 | 约束 | 说明 |
---|---|---|---|---|---|
SId | CAHR | 4 | 否 | 主键,外码,引用学生表中的学号 | 学号 |
CId | CAHR | 3 | 否 | 主键,外码,引用课程号中的学号 | 课程号 |
Score | DECIMAL(5,2) | 是 | 成绩 | ||
SBirth | DATE | 是 | 默认值为当前日期时间 | 选课时间 |
选择数据库mybatis
USE mybatis;
取消外码约束:
SET FOREIGN_KEY_CHECKS=0;
注意:建表应该先建父表再建子表
创建Department(系部表)代码如下:
CREATE TABLE Department(
DId char(3) PRIMARY KEY,
DName varchar(10) NOT NULL UNIQUE,
DHeader char(4),
CONSTRAINT fk_dheader FOREIGN KEY (DHeader) REFERENCES teacher (TId)
)ENGINE=InnoDB DEFAULT CHARSET=gbk;
设置外码约束:
SET FOREIGN_KEY_CHECKS=1;
创建Majority(专业表)代码如下:
CREATE TABLE Major(
MId char(3) COMMENT'专业编号',
MName char(10) NOT NULL UNIQUE COMMENT'专业名称',
MDept char(3) DEFAULT NULL COMMENT'所属系部',
PRIMARY KEY (MId),
FOREIGN KEY (MDept) REFERENCESDepartment (DId)
)ENGINE=InnoDB DEFAULT CHARSET=gbk COMMENT'专业表';
注意:COMMENT关键字用来对字段或者表进行注释。
(主码约束的名字统一为PRIMARY,所以不需要用CONSTRAINT关键字为主码约束取名)
创建Teacher(教师表)代码如下:
CREATE TABLE Teacher(
TId char(4) PRIMARY KEY COMMENT'教师编号',
TName varchar(10) NOT NULL UNIQUE COMMENT'教师姓名',
TGender enum('男','女') COMMENT'性别',
TDept char(3) COMMENT'所在系部',
TRank enum('助教','讲师','副教授','教授')DEFAULT NULL COMMENT'职称',
CONSTRAINT fk_tdept FOREIGN KEY (TDept) REFERENCES Deptartment (DId)
)ENGINE=InnoDB DEFAULT CHARSET=gbk COMMENT'教师表';
创建Student(学生表)代码如下:
CREATE TABLE Student(
SId char(4) PRIMARY KEY COMMENT'学号',
SName varchar(10) NOT NULL COMMENT'姓名',
SGender enum('男','女') DEFAULT'男' COMMENT'性别',
SBirth date COMMENT'出生日期',
SMajor char(3) COMMENT'所属专业',
CONSTRAINT fk_smajor FOREIGN KEY (SMajor) REFERENCES major (MId)
)ENGINE=InnoDB DEFAULT CHARSET=gbk COMMENT'学生表';
创建Course(课程表)代码如下:
CREATE TABLE Course(
CId char(3) COMMENT'课程号',
CName char(20) NOT NULL UNIQUE COMMENT'课程名',
CCredit int DEFAULT NULL COMMENT'学分',
CLimit int DEFAULT 60 COMMENT'限选人数',
PRIMARY KEY (CId),
)ENGINE=InnoDB DEFAULT CHARSET=gbk COMMENT'课程表';
创建Register(注册表)代码如下:
CREATE TABLE Register(
SId char(4) PRIMARY KEY COMMENT'学号',
CId char(3) COMMENT'课程号',
Score decimal(5,2) COMMENT'成绩',
RDate datetime DEFAULT NOW() COMMENT'选课时间',
PRIMARY KEY (SId,CId),
CONSTRAINT fk_CId FOREIGN KEY (CId) REFERENCES Course (CId),
CONSTRAINT fk_SId FOREIGN KEY (SId) REFERENCES Student (SId)
)ENGINE=InnoDB DEFAULT CHARSET=gbk COMMENT'注册表';
注意:Register(注册表)的主码是复合主码,当一个表的主键包含多个属性列时,只能定义为表级约束。
标签:COMMENT,外码,数据库,约束,主码,完整性,KEY,MYSQL From: https://blog.csdn.net/weixin_63043528/article/details/143229571