oracle 表的外键

表的外键

3.5.1表之间的三种关系

在数据库设计中,工作中经常会分析商业逻辑中的表的设计。在设计表的关系之前,需要先了解关系型数据库特点。关系数据库有如下特点:

关系型数据库采用了关系模型来组织数据的数据库。

关系型数据库的最大特点就是事务的一致性;

关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。

在现实业务分析中,理解为每个表和表之间是有联系的,这种联系包括:

1.一对1关系

2.一对多关系

3.多对多关系

一对一关系如球队与球队地址之间的关系,一支球队仅有一个地址,而一个地址也仅有一支球队。在数据库实际应用中,两张表之间是一对一关系, 一般用到的是主键关联。两个表之间有相同的字段,有相同的主键,如果字段不多的情况下可以设计成一个表。

一对多是最普遍的映射关系,比如球员与球队的关系。从球队角度来说一个球队有多个球员即为一对多。一对多的关系在数据库用主从表来体现。 主表有一条数据,从表有多条数据。"一"的那一端是父表,"多"的那一端是子表。

多对多关系也很常见,例如学生与选修课之间的关系,一个学生可以选择多门选修课,而每个选修课又可以被多名学生所选择。

数据库中的多对多关联关系一般需采用中间表的方式处理,将多对多转化为两个一对多。

3.5.2外键的应用

根据商业逻辑分析出两个表的关系是一对多的关系,父表设置一个主键,子表设置一个外键,外键与主键相关联。

外键是用于建立和加强两个表数据之间的链接的一列或多列。通过保存主表中主键值的一列或多列添加到另一个表中,这个列就成为第二个表的外键。

建立外键的格式如下:

create table 表名

(字段列表,

constraint 外键约束名

foreign key( 子表组成外键的字段 )

references 父表名称 ( 父表组成外键的字段 ) )

【例3-7】建立民族表和职工表,民族表包括民族名称,职工表包括职工编号、姓名、民族名称。往民族表插入数据包括汉族、满族、回族、然后往职工表中插入数据汉族、满族、回族。往子表插入苗族测试是否成功。把子表姓名为张海的民族名称修改为布依族, 测试是否成功。

分析两个表之间的关系。一个民族有很多职工,一个职工只有一个民族,所以民族表是父表,职工表是子表,需要在子表上建立外键。具体代码如下:

--第3章\ bdgl.sql

--建立父表和子表

create table minzu

(mincheng varchar2(2) primary key);

create table man

(

Bianhao varchar2(30),

name varchar2(10),

minzu varchar2(10),

constraint fk_minzu foreign key(minzu) references minzu(mincheng));

---父表插入数据

insert into minzu values('汉');

insert into minzu values('满');

insert into minzu values('回');

Commit;

--子表插入数据

insert into man values('001','张海','汉');

insert into man values('002','孙清','满');

insert into man values ('003','王光耀','回');

Commit;

查询主表数据,如图3-11所示。

图3-11查询民族表数据

查询子表数据,如图3-12所示。

图3-12查询职工表数据

往子表插入苗族, 代码如下:

insert into man values ('004','刘海波','苗');

Commit;

执行后会出现错误提示,如图3-13所示。

图3-13违反完整约束条件

会提示违法约束条件,因为父表中没有苗族。结论:子表插入的纪录必须满足外键约束,在父表对应字段有相应的值。

更新子表数据,把姓名为张海的民族名称修改为布依族,代码如下:

Update man set minzu='布衣族' where name='张海';

执行后仍然会提示违法约束条件。因为子表更新的纪录必须满足外键约束,在父表对应字段有相应值。

删除主表的数据,代码如下:

delete from minzu where mincheng = '满';

执行后会出现违法约束条件提示。

结论:直接删除主表的数据是不可以的,需要先删除子表的数据,再删除主表的数据,具体代码如下:

delete from man where minzu = '满';

Commit;

delete from minzu where mincheng = '满';

Commit;

3.6多表查询

当查询的数据并不是来源一个表时,需要使用多表连接操作完成查询。多表连接查询通过表之间的关联字段,一次查询出多个表的数据。

3.6.1等值连接

等值连接也称为简单连接(Simple Joins)或者内连接(Inner Join)。通过等号来判断连接条件中的数据值是否相匹配,具体格式如下:

Select table1_name.fieldname,

table2_name.fieldname

from table1_name, table2_name

Where 条件句

【例3-8】建立雇员表,包括字段编号、姓名、岗位名称。建立职工薪水表包括职工号、姓名、工资。需要查询出编号、姓名、岗位名称、薪水信息。具体代码如下:

--第3章\ bdgl.sql

--建立雇员表

create table EMPLOYEE

( id_1 varchar2(20),

name_1 varchar2(25),

station varchar2(20)

);

--建立职工薪水表

create table SALARY

(

id_2 varchar2(20),

name_2 varchar2(25),

salary NUMBER(8,2)

);

――插入数据

insert into employee values('1','lily','工程师');

insert into employee values('3','lucy','项目经理');

insert into employee values('5','william','人事经理');

insert into employee values('6','demon','行政人员');

insert into employee values('7','david','人事专员');

Commit;

insert into salary values('1','lily',5000);

insert into salary values('2','tom',8000);

insert into salary values('3','lucy',5500);

insert into salary values('4','linda',3500);

insert into salary values('5','william',6000);

Commit;

select a.id_1,a.name_1,a.station,b.salary

from employee a,salary b

where a.id_1=b.id_2 ;

--也可以使用关键字inner join

select a.id_1,a.name_1,a.station,b.salary

from employee a

inner join salary b

on a.id_1=b.id_2 ;

查询结果如图3-14所示。

图3-14使用内连接的查询结果

从查询结果上可以看出查询了雇员表和薪水表中编号相同的数据。

相关推荐
kejijianwen1 小时前
JdbcTemplate常用方法一览AG网页参数绑定与数据寻址实操
服务器·数据库·oracle
编程零零七2 小时前
Python数据分析工具(三):pymssql的用法
开发语言·前端·数据库·python·oracle·数据分析·pymssql
高兴就好(石5 小时前
DB-GPT部署和试用
数据库·gpt
这孩子叫逆5 小时前
6. 什么是MySQL的事务?如何在Java中使用Connection接口管理事务?
数据库·mysql
Karoku0665 小时前
【网站架构部署与优化】web服务与http协议
linux·运维·服务器·数据库·http·架构
码农郁郁久居人下5 小时前
Redis的配置与优化
数据库·redis·缓存
MuseLss6 小时前
Mycat搭建分库分表
数据库·mycat
Hsu_kk7 小时前
Redis 主从复制配置教程
数据库·redis·缓存
DieSnowK7 小时前
[Redis][环境配置]详细讲解
数据库·redis·分布式·缓存·环境配置·新手向·详细讲解
程序猿小D7 小时前
第二百三十五节 JPA教程 - JPA Lob列示例
java·数据库·windows·oracle·jdk·jpa