约束
就是使用一些规则限制数据,保证数据合法性/准确性,从而满足需求
-- 分类:
1. 行级约束(对某一列进行限制) 在列类型的后面的约束 可以出现多次
1.1 NULL NOT NULL 非空约束
1.2 UNIQUE 唯一性约束/索引(是数据结构)
保证列的数据唯一
在一张表里面使用多次UNIQUE修饰多个列。
1.3 DEFAULT 默认约束(设置默认数据)
1.4 PRIMARY KEY 主键约束(重要)
1.既可以是行级约束,又可以是表级约束,自带索引的
2.一张表里面只能使用1次 PRIMARY KEY
3.使用 PRIMARY KEY 修饰的列一般称为"主键列"
4.主键列的数据: 非空+唯一
5.理论上任意一个列都可以作为主键列。实际开发中,一般都是id.
5。 为什么要使用主键约束?
1. 保证记录唯一性。
2. 满足表设计的3大范式。
2.1 第一范式: 保证列的原子性 列不可再分的原则。
2.2 第二范式: 在满足第一范式前提下,保证行记录的唯一性.建议使用主键列
2.3 第3范式: 在满足第2范式前提下,减少列/数据的冗余。排除外键列的数据。
NOT NULL+UNQIUE==主键约束
新增的时候 每次都要自已维护id的唯一性保证id数据唯一性?
1.mysql服务器,id自己自增(使用居多) 要求 列必须是主键约束/整数类型
2。java程序控制 提供唯一的数据 作为id的数据
问题: id是字符类型,保证数据的唯一性? 不能自增了
1.java程序提交唯一的id
2.mysql服务: UUID() UUID_SHORT()
uuid: 128位 由16进制的字符组成的串
需求:设置id自增 auto_increment默认从1开始 自增的步长 1 当然可以修饰自增的初始值以及步长 有索引才能自增
ALTER TABLE a MODIFY id INT auto_increment;
获得上一次自增的id数据
SELECT LAST INSERT ID();
修改自增的初始值或者步长
ALTER TABLE a auto_increment 2001;
更改步长 set 指全局
SET auto increment_increment=5;
2. 表级约束
2.1 PRIMARY KEY(联合主键)位置: 在最后一个列的后面使用
CREATE TABLE C(
id BIGINT(1) auto increment,
name VARCHAR(20),
PRIMARY KEY(id)-- 表级约束
使用navicat可以点击多次主键 意味着表里面有联合主键
联合主键: 必须使用表级约束编写
多个列作为一个主键列体现
一般出现的场景: 在中间表里面
2.2 FOREIGN KEY 外键约束(维护多表关系的)
外键约束,自带索引。
维护多张表的关系。
1.在一张表里面,可以使用多次 FOREIGN KEY修饰多个列。
2.使用 FOREIGN KEY修饰的列,称为"外键列"一张表中,外键列可以有多个的。
3.外键列的数据不能对于设置。外键列的数据要严格参照另外一张表的主键列的数据。
4.主表与从表之间关系。有外键列在的表,称为"从表"。外键列的数据参照的表就是"主表/基表"。从表里面外键列的数据严格参照主表里面主键列的数据。
5.外键列的数据类型与主表的主键列的数据类型一致。
意义:
保证数据安全性。性能低。
要使用外键约束,必须要保证数据库存储引擎是InnoDB
外键约束都在从表里面进行设置
ALTER TABLE 从表 ADD constraint foreign key (从表id) references 主表(id);
建表时:
foreign key(uid) references 主表(id)
外键三个特性(在开发中禁止使用)
--RESTRICT--
1.操作主表
SELECT * FROM sys user;-- ok
INSERT INTo sys user(true name)VALUES('admin');
UPDATE sys user SET age=20 WHERE id=1;--ok
DELETE FROM sys user WHERE id=3;
DELETE FROM sys user WHERE id=1;
删除主表 遍历查询所有子表是否关联使用id的数据
没有使用 可以删除
子表在使用这些数据 无法删除的
保证数据安全性
--SET NULL--
1.操作主表
SELECT * FROM sys user;-- OK
INSERT INTO sys user(true_name)VALUES('admin');-- ok
UPDATE sys user SET age=30 WHERE id=2;-- ok
DELETE FROM sys user WHERE id=4;
DELETE FROM sys user WHERE id=1;
删除主表 遍历查询所有子表是否关联使用id的数据
没有使用可以删除
子表在使用这些数据,会遍历式的先设置子表里面的外键列的数据为null 然后再删除主表的记录
--CASCADE(级联)--
1.操作主表
SELECT * FROM sys user;-- ok
INSERT INTo sys user(true name)VALUES('admin');-- OK
UPDATE sys user SET age=30 WHERE id=5;-- ok
DELETE FROM sys user WHERE id=5;
DELETE FROM sys user WHERE id=2;
删除主表遍历查询所有子表是否关联使用id的数据
没有使用 可以删除
子表在使用这些数据会遍历式的删除子表相关记录 然后再删除主表的记录
表设计
1.一对一
随便一张表加外键 维护关系
2.一对多
将'外键列'加在多的表上 维护关系
3.多对多
中间表 两个外键列