目录
数据库设计的三大范式
概述
为了建立冗余较小,结构合理的数据库,设计数据库时必须遵循一定的规则,在关系型数据库种这种规则成为范式
作用
约束作用;数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的、结构明晰的,同时,不会发生插入(insert)、删除(delete)和更新(update)操作异常。
三范式
- 第一范式(1NF):确保每列保持原子性
- 第二范式(2NF):确保表中的每列都和主键相关
- 第三范式(3NF):确保每列都和主键直接相关,而不是简介相关
三大范式只是设计数据库的基本理念,可以建立冗余较小、结构合理的数据库,如有特殊情况,特殊对待,数据库设计最重要的是看需求和性能,需求>性能>表结构,因此不能一味的追求范式建立数据库
约束
概述
约束实际上就是表中数据的限制条件
作用
表在设计的时候加入约束的目的就是为保证表中的记录完整且有效
约束种类
非空约束
- 用not null约束的字段不能为null值,必须给定具体的数据;空字符串''和0不等于null
- 非空约束只能出现在表对象的列上,只能某个列单独限定非空,不能组合非空
- 一个表可以有多列都分别限定了非空
-- 非空约束
CREATE TABLE tb2(
username VARCHAR(10) NOT NULL,
userage INT
)
CREATE TABLE tb3(
username VARCHAR(10) NOT NULL DEFAULT '无名',
userage INT
)
唯一性约束
- unique约束的字段,具有唯一性,不可重复,但可以为null
- 同一个表可以有多个唯一约束;
- 唯一约束可以是某一列的值唯一,也可以多个列组合值唯一
- 在创建唯一约束时,如果不给唯一约束命名,就默认和列名形同
- MySQL会给唯一约束的列上默认创建一个唯一索引
-- 唯一约束 可以为null(并且可以有多个)【因为null是一个类型】
CREATE TABLE tb4(
username VARCHAR(10) UNIQUE, -- 行级约束 唯一约束
userage INT UNIQUE -- 每个字段都是各自的唯一约束
);
CREATE TABLE tb5(
username VARCHAR(10),
userage INT,
UNIQUE(username,userage) -- 表级约束 联合唯一约束
-- 字段是有关联的,每个字段的值都相同时,会触发
);
CREATE TABLE tb6(
username VARCHAR(10),
userage INT,
CONSTRAINT name_age_unique UNIQUE(username,userage) -- 为表级约束起名字 constraint 是约束关键字
);
主键约束
- primary key是表中的一个或多个字段,它的值用于唯一的标识表中的某一条记录;表中的某个字段添加主键约束后,该字段为主键字段,主键字段中出现的每一个数据都称为主键值
- 主键值是当前行数据的唯一标识、是当前行数据的身份证号;即使表中两行记录相关数据相同,但由于主键值不同,所以也认为是两行不同的记录
- 在MySQL数据库提供了一个自增的数字,专门用来自动生成主键值,主键值不用用户维护,自动 生成,自增数从1开始,以1递增(auto_increment)
-- 主键约束 每张表必须有且只有一个主键
-- 主键的值是唯一的 不能为null
CREATE TABLE tb7(
username VARCHAR(10) PRIMARY KEY,
userage INT
)
CREATE TABLE tb8(
username VARCHAR(10),
userage INT,
PRIMARY KEY(username,userage) -- 联合主键,联合约束
-- 对个字段的值,只有完全相同时,才能触发约束
)
-- 一般主键的建立方式
-- int bigint 自增
-- 主键的值是不会回补的
CREATE TABLE tb9(
tid int primary key auto_increment, -- 自增
username VARCHAR(10),
userage INT
);
主键约束与“not null unique”区别
- 作为Primary Key的域/域组不能为null,而Unique Key可以。
- 在一个表中只能有一个Primary Key,而多个Unique Key可以同时存在。unique not null 可以 将表的一列或多列定义为唯一性属性,而primary key设为多列时,仅能保证多列之和是唯一的, 具体到某一列可能会重复。
- 更大的区别在逻辑设计上。Primary Key一般在逻辑设计中用作记录标识,这也是设置 Primary Key的本来用意,而Unique Key只是为了保证域/域组的唯一性。
外键约束
- 外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。若有两个表A、B,id是A的主键,而B中也有id字段,则id就是表B的外键 【A为基本表或父标,主表,B为信息表,子表,副表】
-- 外键约束——只能是表级约束
-- 外键的值可以重复 可以为null 必须要写父表中有的数据
-- 父表中的关联字段必须是一个具有唯一性的数据
-- 父表中的字段名和从表中的字段名可以不同,但类型必须一致
-- 一个表中可以有多个外键,也可以有多个外键约束 但是只能有一个主键
-- 添加数据时,先添父表 再添子表;删除数据时,先删子表 再删父表
-- 使用外键关系,不去建立外键约束
CREATE TABLE a(
aid INT primary KEY auto_increment,
aname VARCHAR(10)
);
DROP TABLE b;
CREATE TABLE b(
bid INT PRIMARY key auto_increment,
bname VARCHAR(10),
aid INT,
FOREIGN KEY(aid) REFERENCES a(aid)
);
约束的添加
- 添加非空约束:alter table 表名 modify test_student char(10) not null;
- 添加唯一约束:alter table 表名 add unique(表字段名,字段,字段,字段);
- 添加主键约束:alter table 表名 add primary key(表的字段名,字段,字段);
- 添加外键约束:
alter table 表名 add constraint N1 foreign key (表字段名) references 父表(父表字段名);
约束的删除
- 删除not null约束:alter table 表名 modify 列名 类型;
- 删除unique约束:alter table 表名 drop index 唯一约束名;
- 删除primary key约束:alter table 表名 drop primary key;
- 删除foreign key约束:alter table 表名 drop foreign key 外键名;
检查约束
目前MySQL不支持,Oracle支持
注:给已经创建的表添加约束,必须保证表中的数据满足该约束