创建外键约束
mysql 创建表的外键输入举例
/*创建department,employee ,department 一对多 employee */
/*创建department*/
create table department(
id bigint primary key auto_increment,
dep_name varchar(200),
dep_location varchar(200)
);
/*创建employee*/
create table employee(
id bigint primary key auto_increment,
ename varchar(10),
age int(3),
dept_id bigint,
constraint emp_dept_pk foreign key (dept_id) references department(id)
)
是否要使用外键约束
使用外键约束可以保证数据的完整性和一致性,另外使用外键约束还可以自动执行关联表之间的操作,类似级联更新和级联删除,另外使用 外键约束可以清晰定义表之间的关系,更易于理解和维护。在银行,工业领域需要 ## 外键约束带来问题 1. 性能问题 每次插入时一定会查询外表 2. 死锁 外键查询依赖于外表,表名innodb需要在父级表中检验相应的值同时也会锁定父级表的数据行,用来保证事务完成前不会删除,可能导致死锁, 3. 分库分表困难 4. 开发测试效率降低
删除外键约束
alter table 从表 drop foreign key 外键约束的名称
删除 employee 外键表
alter table employee drop foreign key emp_dept_fk;
创建表之后添加外键
alter table 从表 add constraint emp_dept_fk foreign key(dept_id) references department(id) 简写 alter table employee add foreign key(dept_id) references department(id)
外键约束的注意事项
- 从表的外键类型和主表的类型必须一致
- 添加数据时,应该添加主表的数据
- 删除数据时候,先删除从表中的数据
级联删除
删除主表中的数据同时,可以删除与之相关的从表的数据 on delete cascade
create table employee (
eid bigint primary key auto_increment,
ename varchar(20),
age int,
dept_id bigint,
constraint emp_dept_pk foreign key(dept_id) references department(id)
on delete cascade
);
多对多,演员与角色
create table actor(
id int primary key auto_increment,name varchar(20));
create table role(id int primary key auto_increment, name varchar(20));
create table actor_role(
id int primary key auto_increment, aid int ,rid int);
alter table actor_role add foreign key(aid) references actor(id);
alter table actor_role add foreign key(rid) references role(id);
多表查询, 交叉连接查询的结果会产生 笛卡尔积,是不能够使用的。
select * from 左表,右表 where 条件,
1. 内连接查询
select * from 左表 inner join右表 on 左表.字段 = 右表.字段 where 条件
2. 外连接查询
左外连接
语法格式 关键字 left [outer] join
select 字段名 from 左表 left join 右表 on 连接条件
左外连接特点
以左表为基准 匹配右表中的数据 如果匹配上就显示,如果匹配不上,左表中的数据正常显示,右表数据显示null
select * from category c left join products p on c.cid = p.category_id;
右外连接
语法格式 关键字 right [outer] join
select 字段名 from 左表 right join 右表 on 条件
右连接的特点:
以右表为基准匹配左表中的数据,如果匹配上就显示如果匹配不上 右表中的数据就正常显示,左表显示null
- 子查询 查询价格最高的商品信息,1. 查询出最高的价格,2.根据价格查询商品信息 子查询分类 where 型子查询,将子查询的结果作为父查询 ,比较条件实用 from 型子查询 将子查询的查询结果作为一张表使用 exists 型子查询,查询结果是单列多行的情况,可以将子查询的结果作为父查询in函数中的条件实用
数据库 三范式
作用 创建 冗余较小, 结构合理的数据库,空间最少原则 范式 就是设计数据库的要求 ### 第一范式 满足最低要求的范式,列具有原子性,列设计要做到不可以拆分 ### 第二范式 在满足第一范式的基础上,进一步满足更多范式,一张表只能描述一件事情 ### 第三范式 在满足第二范式基础上,表中信息如果能够被推到出来,就不要涉及一个字段单独来记录
反三范式
指的是通过增加冗余字段或者重复数据,提高数据库的读性能 浪费存储空间 节省查询时间 冗余字段,某一个字段属于一张表,但是又在多张表中都有出现。减少join操作,数据库执行更快