约束
- 约束是作用于表中列上的数据,用于限制加入表的数据
- 约束的存在保证了数据库中数据的完整性、正确性、有效性
约束名称 | 描述 | 关键字 |
非空约束 | 保证列中所有数据不能有null值 | not null |
唯一约束 | 保证列中所有的数据各不相同 | unique |
主键约束 | 主键是一行数据的唯一标识 | primary key |
检查约束 | 保证列中的值满足某一条件 | check |
默认约束 | 保存数据时,未指定值则采用默认值 | default |
外键约束 | 外键用来让两个表的数据之间建立联系,保证数据的一致性和完整性 | foreign key |
MySQL不支持检查约束,可以在java代码中完成约束
-- 主键的自动增长
id int primary key auto_increment,
-- 员工表
create table emp(
id int primary key, -- 员工id,主键且自增长
ename varchar(50) not null unique, -- 姓名,非空且唯一
joindate date not null, -- 入职日期,非空
salary double(7,2) not null, -- 工资,非空
bonus double(7,2) default 0 -- 奖金,默认为0
);
-- 插入wdh的数据
insert into emp (
id,
ename,
joindate,
salary,
bonus
)
Values(
1,
'王大珩',
'2022-02-10',
'8000',
'5000'
);
-- 当你不想给'社会你虎哥'奖金时,就不添加奖金,默认为0
-- 但不能使用 null 代替0,因为在SQL中 null 和 0 不同
INSERT INTO emp (
id,
ename,
joindate,
salary
)
VALUES(
3,
'社会你虎哥',
'2020-06-30',
10000
);
外键约束(难点)
狭义上讲:外键约束就是根据两个表的数据的物理联系建立的计算机层面的联系
constraint fk_新表_原表 foreign key(外键列名) references 主表(主表中的列名)
主表 ↑ 建立联系后,主表的id和从表dep_id相同值对应的类型相同
从表 ↓
在建立主从表联系之后,不能直接删除主表中的元素,除非从表中带有某个主表的元素全部不存在,才能删除该元素
(比如假设主表中的丁真割割被KTV了,才能删除 " 3,'外贸部','上海' " 这一行)
逆向表到模型
-- 建立部门表
CREATE table dept(
id int PRIMARY KEY auto_increment,
dep_name varchar(10) not null unique,
addr varchar(10)
);
-- 建立员工表
CREATE table emp2(
id int PRIMARY KEY auto_increment,
name varchar(50) not null unique,
age int not null,
dep_id int,
-- 添加外键 dep_id, 关联 dept 表的id主键
constraint fk_emp1_dept foreign key(dep_id) references dept(id)
);
select * from emp2;
select * from dept;
-- 添加部门信息
insert into dept(dep_name,addr) values
('研发部','四川'),('销售部','东百'),('外贸部', '上海');
-- 添加员工 dep_id 表示员工所在的部门
insert into emp2(name, age, dep_id) values
('孙狗', 30, 1),
('李老八', 30, 1),
('丁真', 18, 3),
('赵三金', 23, 2),
('二次元刀酱', 38, 2),
('唐老鸭', 22, 2);
表关系
- 一对一
如:用户和用户详情
- 一对多(多对一)
如:部门和员工,一个部门对应多个员工,一个员工对应一个部门
- 多对多
如:商品和订单,一个商品对应多个订单,一个订单包含多个商品
实例模型:
一对多:部门-员工模型
多对多:淘宝-电商模型
一对一:用户-用户详情模型
源码参照前一节的数据库约束
-- 创建订单表
create table tb_order(
id int primary key,
payment double(7,2) not null,
payment_type varchar(20) not null,
status varchar(10) not null
);
-- 创建商品表
create table tb_goods(
id int primary key,
title varchar(30) not null,
price double(7,2)
);
-- 创建订单商品中间表
create table tb_order_goods(
id int primary key,
order_id int not null,
goods_id int not null,
count int default 1
);
alter table tb_order_goods add constraint fk_order_id foreign key (order_id) references tb_order(id);
alter table tb_order_goods add constraint fk_goods_id foreign key (goods_id) references tb_goods(id);
create table tb_user(
id int primary key,
nickname varchar(20) not null,
age int not null,
gender char(8) default '保密'
);
create table tb_user_desc(
id int primary key,
city varchar(20) not null,
edu varchar(20) not null,
income int,
status varchar(20) default '保密'
);
alter table tb_user_desc add constraint fk_user_desc foreign key (id) references tb_user(id);
insert into tb_user values
(1, '山泥若',20,'男'),
(2, '丁真',22,'男'),
(3, '冯雪娟',32,'女');
insert into tb_user_desc values
(1, '上海','本科',800000,'单身'),
(2, '上海','初中',137666,'单身'),
(3, '成都','带专',3000,'离异');
select * from tb_user;
select * from tb_user_desc;
部分图源:黑马程序员