- 本文在学习了数据库库理论后的一个总结,以加深理解、形成知识架构和方便日后复习
- 本文主要包括ER图与五大约束
一、ER 图
一个例子
ER 图例子组成元素
- ER图分为实体、属性、关系三个核心部分
- 实体:长方形
- 属性:椭圆形
- 关系:菱形
实体(entity)
- 即数据模型中的数据对象
例如人、学生、音乐都可以作为一个数据对象,用长方体来表示。每个实体都有自己的实体成员(entity member)或者说实体对象(entity instance),例如学生实体里包括张三、李四等,实体成员(entity member)/实体实例(entity instance) 不需要出现在ER图中。
属性(attribute)
- 即数据对象所具有的属性
例如学生具有姓名、学号、年级等属性,用椭圆形表示,属性分为唯一属性( unique attribute)和非唯一属性,唯一属性指的是唯一可用来标识该实体实例或者成员的属性,用下划线表示,一般来讲实体都至少有一个唯一属性。
关系(relationship)
- 用来表现数据对象与数据对象之间的联系
例如学生的实体和成绩表的实体之间有一定的联系,每个学生都有自己的成绩表,这就是一种关系,关系用菱形来表示。
关联关系
1对1关系(1:1)
- 实体集A中的每一个实体至多与实体集B中一个实体有关系
- 在实体集B中的每个实体至多与实体集A中一个实体有关系
1对多关系(1:N)
- 实体集A与实体集B中至少有N(N>0)个实体有关系
- 实体集B中每一个实体至多与实体集A中一个实体有关系
多对多关系(M:N)
- 实体集A中的每一个实体与实体集B中至少有M(M>0)个实体有关系
- 实体集B中的每一个实体与实体集A中至少有N(N>0)个实体有关系
二、约束(CONSTRAINT)
简介
作用
约束主要完成对数据的检验和限制,从而保证数据库的完整性。
关系型数据库有三大完整性:
- 实体完整性
实体属性中的标识属性不能为空、不能重复,该约束通过制定的主键实现,其约束有系统强制实施 - 参照完整性
实体中的外键可以为空,但不能是错的 - 用户定义完整性
某一具体的实际数据库的约束条件,由应用环境所决定,反映某一具体应用所涉及的数据必须满足的要求。(例如定义某一行不能为空)
基本语法
alter table 表名称 add constraint 约束名称 增加的约束类型 (列名)
分类
约束主要有五类:
1.主键约束(PRIMARY KEY)
- 每行都具有一个主键值
- 任意两行的主键值都不相同
- 不允许出现空值
单列主键
创建有两种方式:
添加关键字
一种是直接对字段加primary key
关键字:
CREATE TABLE student(
id INT PRIMARY KEY,
name VARCHAR(20),
)
添加额外约束
另外一种是通过额外加约束的方式:
CREATE TABLE student(
id INT NOT NULL,
name VARCHAR(20),
CONSTRAINT PK_STUD_ID PRIMARY KEY(id)
//PK_STUD_ID为约束的名字
)
联合主键
有时候一个列的字段可能有重复,可以联合多个列设为主键。
CREATE TABLE student(
name VARCHAR(20),
class VARCHAR(20),
CONSTRAINT PK_STUD_ID PRIMARY KEY(name,class)
)
增删改
//添加主键
ALTER TABLE 表名 ADD PRIMARY KEY(列名);
//删除主键约束
ALTER TABLE 表名 DROP PRIMARY KEY;
//修改列为主键
ALTER TABLE 表名 MODIFY 列名 数据类型 PRIMARY KEY;
2.外键约束(FOREIGN KEY)
- 外键约束是保证一个或两个表之间的参照完整性,保持数据一致性
- 表的外键可以是另一表的主键(也可以是唯一索引,详情看这里), 外键可以有重复的, 可以是空值
- 实现一对一或一对多关系
创建外键约束
CREATE TABLE classes(
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20)
);
创建有两种方式:
添加关键字
CREATE TABLE student(
id INT AUTO_INCREMENT,
name VARCHAR(20),
CONSTRAINT PK_ID PRIMARY KEY(id),
class_id INT REFERENCES classes(id)
)
额外声明
CREATE TABLE student(
id INT AUTO_INCREMENT,
name VARCHAR(20),
CONSTRAINT PK_ID PRIMARY KEY(id),
class_id INT,
CONSTRAINT fk_class_id FOREIGN KEY(classe_id) REFERENCES classes(id)
)
外键约束的要求
- 父表和子表必须使用相同的存储引擎,而且禁止使用临时表
- 数据表的存储引擎只能为InnoDB,
default-storage-engine-INNODB
- 外键列和参照列必须具有相似的数据类型
- 数字的长度或是有符号位必须相同
- 字符 的长度可以不同
- 外键列和参照列必须创建索引,如果外键列不存在索引的话,MySQL将自动创建索引。
外键约束的参照操作
参照 | 说明 |
---|---|
CASCADE | 从父表删除或更新且自动删除或更新子表中匹配的行 |
SET NULL | 从父表删除或更新行,并设置子表中的外键列为NULL,如果使用该选项,必须保证子表列没有指定NOT NULL |
RESTRICT | 拒绝对父表的删除或更新操作 |
NO ACTION | 标准SQL的关键字,在MySQL中与RESTRICT相同 |
增删
//删除外键约束
ALTER TABLE 表名 DROP FOREIGN KEY 外键约束名;
(创建外键的方法没有指定约束名称,系统会默认给外键约束分配外键约束名称,命名为student_ibfk_n)
//增加外键约束
ALTER TABLE 表名 ADD FOREIGN KEY 列名 REFERENCES 父表(对应列名);
3.唯一约束(UNIQUE)
指定表中某一列或多个列不能有相同的两行或者两行以上的数据存在,保证记录的唯一性。主要是用来防止数据插入的时候重复。
- 唯一约束的字段可以为空值(允许的空值有多个,但是最终存储的只有一个)
- 每张数据表可以存在多个唯一约束
创建有两种方式:
添加关键字
CREATE TABLE student(
name CHAR(20) UNIQUE KEY
);
额外声明
ALTER TABLE student MODIFY CHAR(20) UNIQUE KEY;
4.非空约束(NOT NULL)
输入值必须是非空的,需要注意的是允许控制尽量不要太多,太多会更消耗数据库性能。
CREATE TABLE student(
name CHAR(20) NOT NULL
);
5.默认约束(DEFAULT)
默认约束有以下的要求:
- 定义的常量必须与该列的数据类型、精度等匹配
- 每个列只能定义一个DEFAULT约束
这里需要说明的是,DEFAULT后面不能像SQL Server那样使用函数,后面只能是一个常量。官方文档原文:
With one exception, the default value must be a constant; it cannot be a function or an expression.
6.CHECK约束
CHECK约束,验证数据,比如性别中只能为女或男,而不能为其它。MySQL不支持check约束,但可以使用check约束,就是没有任何效果。
网友评论