MySQL基础9-主键约束、外键约束、等值连接查询、一对一和多对多关系
2016-11-11 11:35
651 查看
1.主键约束和外键约束
![](https://images2015.cnblogs.com/blog/964016/201611/964016-20161111113057264-574965007.png)
外键约束
* 外键必须是另一表的主键的值(外键要引用主键!)
* 外键可以重复
* 外键可以为空
* 一张表中可以有多个外键!
概念模型在数据库中成为表
数据库表中的多对一关系,只需要在多方使用一个独立的列来引用1方的主键即可
/*员工表*/
create talbe emp (
empno int primary key,/*员工编号*/
...
deptno int/*所属部门的编号*/
);
/*部门表*/
create table dept (
deptno int primary key,/*部门编号*/
...
);
emp表中的deptno列的值表示当前员工所从属的部门编号。也就是说emp.deptno必须在dept表中是真实存在!
但是我们必须要去对它进行约束,不然可能会出现员工所属的部门编号是不存在的。这种约束就是外键约束。
我们需要给emp.deptno添加外键约束,约束它的值必须在dept.deptno中存在。外键必须是另一个表的主键!
语法:CONSTRAINT 约束名称 FOREIGN KEY(外键列名) REFERENCES 关联表(关联表的主键)
创建表时指定外键约束
create talbe emp (
empno int primary key,
...
deptno int,
CONSTRAINT fk_emp FOREIGN KEY(mgr) REFERENCES emp(empno)
);
修改表时添加外键约束
ALERT TABLE emp
ADD CONSTRAINT fk_emp_deptno FOREIGN KEY(deptno) REFERENCES dept(deptno);
修改表时删除外键约束
ALTER TABLE emp
DROP FOREIGN KEY fk_emp_deptno;/*约束名称*/
![](https://images2015.cnblogs.com/blog/964016/201611/964016-20161111113610780-1229286613.png)
外键约束
![](https://images2015.cnblogs.com/blog/964016/201611/964016-20161111114612733-630482798.png)
2. 数据库一对一关系
在表中建立一对一关系比较特殊,需要让其中一张表的主键,即是主键又是外键。
create table husband(
hid int PRIMARY KEY,
...
);
create table wife(
wid int PRIMARY KEY,
...
ADD CONSTRAINT fk_wife_wid FOREIGN KEY(wid) REFERENCES husband(hid)
);
其中wife表的wid即是主键,又是相对husband表的外键!
husband.hid是主键,不能重复!
wife.wid是主键,不能重复,又是外键,必须来自husband.hid。
所以如果在wife表中有一条记录的wid为1,那么wife表中的其他记录的wid就不能再是1了,因为它是主键。
同时在husband.hid中必须存在1这个值,因为wid是外键。这就完成了一对一关系。
*****从表的主键即是外键!
3. 数据库多对多关系
在表中建立多对多关系需要使用中间表,即需要三张表,在中间表中使用两个外键,分别引用其他两个表的主键。
create table student(
sid int PRIMARY KEY,
...
);
create table teacher(
tid int PRIMARY KEY,
...
);
create table stu_tea(
sid int,
tid int,
ADD CONSTRAINT fk_stu_tea_sid FOREIGN KEY(sid) REFERENCES student(sid),
ADD CONSTRAINT fk_stu_tea_tid FOREIGN KEY(tid) REFERENCES teacher(tid)
);
这时在stu_tea这个中间表中的每条记录都是来说明student和teacher表的关系
例如在stu_tea表中的记录:sid为1001,tid为2001,这说明编号为1001的学生有一个编号为2001的老师
sid tid
101 201 /*编号为101的学生有一个编号为201的老师*/
101 202 /*编号为101的学生有一个编号为202的老师*/
101 203 /*编号为101的学生有一个编号为203的老师*/
102 201 /*编号为102的学生有一个编号为201的老师*/
102 204 /*编号为102的学生有一个编号为204的老师*/
4.表的命名和规范
![](https://images2015.cnblogs.com/blog/964016/201611/964016-20161111184053014-1845863471.png)
5.多表查询的类型
![](https://images2015.cnblogs.com/blog/964016/201611/964016-20161111190750358-1037882302.png)
例如:连接三个表,至少需要两个连接条件
栗子1:
查询零售价大于200的无线鼠标
SELECT p.productName,pd.dirName,p.salePrice
FROM product p,productdir pd
WHERE p.dir_id=pd.id AND p.saleprice>200 AND pd.dirName='无线鼠标'
使用AND操作符增加查询条件
![](https://images2015.cnblogs.com/blog/964016/201611/964016-20161111113057264-574965007.png)
外键约束
* 外键必须是另一表的主键的值(外键要引用主键!)
* 外键可以重复
* 外键可以为空
* 一张表中可以有多个外键!
概念模型在数据库中成为表
数据库表中的多对一关系,只需要在多方使用一个独立的列来引用1方的主键即可
/*员工表*/
create talbe emp (
empno int primary key,/*员工编号*/
...
deptno int/*所属部门的编号*/
);
/*部门表*/
create table dept (
deptno int primary key,/*部门编号*/
...
);
emp表中的deptno列的值表示当前员工所从属的部门编号。也就是说emp.deptno必须在dept表中是真实存在!
但是我们必须要去对它进行约束,不然可能会出现员工所属的部门编号是不存在的。这种约束就是外键约束。
我们需要给emp.deptno添加外键约束,约束它的值必须在dept.deptno中存在。外键必须是另一个表的主键!
语法:CONSTRAINT 约束名称 FOREIGN KEY(外键列名) REFERENCES 关联表(关联表的主键)
创建表时指定外键约束
create talbe emp (
empno int primary key,
...
deptno int,
CONSTRAINT fk_emp FOREIGN KEY(mgr) REFERENCES emp(empno)
);
修改表时添加外键约束
ALERT TABLE emp
ADD CONSTRAINT fk_emp_deptno FOREIGN KEY(deptno) REFERENCES dept(deptno);
修改表时删除外键约束
ALTER TABLE emp
DROP FOREIGN KEY fk_emp_deptno;/*约束名称*/
![](https://images2015.cnblogs.com/blog/964016/201611/964016-20161111113610780-1229286613.png)
外键约束
![](https://images2015.cnblogs.com/blog/964016/201611/964016-20161111114612733-630482798.png)
2. 数据库一对一关系
在表中建立一对一关系比较特殊,需要让其中一张表的主键,即是主键又是外键。
create table husband(
hid int PRIMARY KEY,
...
);
create table wife(
wid int PRIMARY KEY,
...
ADD CONSTRAINT fk_wife_wid FOREIGN KEY(wid) REFERENCES husband(hid)
);
其中wife表的wid即是主键,又是相对husband表的外键!
husband.hid是主键,不能重复!
wife.wid是主键,不能重复,又是外键,必须来自husband.hid。
所以如果在wife表中有一条记录的wid为1,那么wife表中的其他记录的wid就不能再是1了,因为它是主键。
同时在husband.hid中必须存在1这个值,因为wid是外键。这就完成了一对一关系。
*****从表的主键即是外键!
3. 数据库多对多关系
在表中建立多对多关系需要使用中间表,即需要三张表,在中间表中使用两个外键,分别引用其他两个表的主键。
create table student(
sid int PRIMARY KEY,
...
);
create table teacher(
tid int PRIMARY KEY,
...
);
create table stu_tea(
sid int,
tid int,
ADD CONSTRAINT fk_stu_tea_sid FOREIGN KEY(sid) REFERENCES student(sid),
ADD CONSTRAINT fk_stu_tea_tid FOREIGN KEY(tid) REFERENCES teacher(tid)
);
这时在stu_tea这个中间表中的每条记录都是来说明student和teacher表的关系
例如在stu_tea表中的记录:sid为1001,tid为2001,这说明编号为1001的学生有一个编号为2001的老师
sid tid
101 201 /*编号为101的学生有一个编号为201的老师*/
101 202 /*编号为101的学生有一个编号为202的老师*/
101 203 /*编号为101的学生有一个编号为203的老师*/
102 201 /*编号为102的学生有一个编号为201的老师*/
102 204 /*编号为102的学生有一个编号为204的老师*/
4.表的命名和规范
![](https://images2015.cnblogs.com/blog/964016/201611/964016-20161111184053014-1845863471.png)
5.多表查询的类型
![](https://images2015.cnblogs.com/blog/964016/201611/964016-20161111190750358-1037882302.png)
例如:连接三个表,至少需要两个连接条件
栗子1:
查询零售价大于200的无线鼠标
SELECT p.productName,pd.dirName,p.salePrice
FROM product p,productdir pd
WHERE p.dir_id=pd.id AND p.saleprice>200 AND pd.dirName='无线鼠标'
使用AND操作符增加查询条件
![](https://images2015.cnblogs.com/blog/964016/201611/964016-20161111192823249-1389939838.png)
相关文章推荐
- MySQL基础8-笛卡尔积和等值连接(多表查询)
- sqlserver 基础(增、删、改、查、链表查询、建立聚焦索引、主键、创建约束、创建外键)、触发器、存储过程
- MySQL中的查询约束语句和主键、联合主键、外键
- 【Mysql】利用内连接与嵌套查询实现多表查询,主键、外键的基本概念
- MYSQL人事工资管理系统--主键和外键、查询约束(二)
- 查询(看)表的主键、外键、唯一性约束和索引
- 如何在oracle中查询所有用户表的表名、主键名称、索引、外键等 - Oracle 基础和管理_files
- MySQL多表查询之外键、表连接、子查询、索引
- hibernate mysql查询首字母排序两表连接外键
- MYSQL基础_聚合函数_分组和多表连接查询
- oracle数据库中的查询主键外键的约束
- Sql语句中两个比较迷糊的概念:“连接查询” 与 “外键约束”
- mysql学习-主键,外键,约束,索引
- mysql建表: 主键,外键约束
- 内、外、左、右连接、唯一,主键,外键约束
- 关于外键约束和对应主键信息的查询脚本
- ORACLE: 查询(看)表的主键、外键、唯一性约束和索引
- ORACLE 数据库(查询--主键外键约束)
- mysql 查询某一主键在那些表中中被设置为外键了