oracle 表的外键

news/2025/1/15 12:44:43/

表的外键

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使用内连接的查询结果

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


http://www.ppmy.cn/news/1526023.html

相关文章

C#笔记11 获取线程及其信息,什么是优先级、单元状态、线程状态、执行状态、线程名称以及其他属性?

前文讲完了在C#中线程怎么创建,怎么删除,怎么启动,怎么阻止。 现在来看看线程本身的属性。 当前线程 首先要获得当前线程,才能获取线程信息,此属性用于获取当前运行的线程。此属性可用于获取代码当前执行所在的线程…

qt下两种方式读取opencv 图片各个通道的值

qt下两种方式读取opencv 图片各个通道的值 Mat srcImg imread("D:\\1.jpg");if(srcImg.empty()){QMessageBox::information(this,"警告","图片读取失败,请检查图片路径!");return;}Mat imgShow ;cvtColor(srcImg, imgSho…

企微机器人:企业数字化转型的得力助手

在数字化转型的浪潮中,企业对于提高运营效率、降低人力成本的需求日益迫切。企微机器人,作为基于企业微信平台开发的一种智能工具,以其高度自动化、灵活性强、安全性高和易于使用的特点,迅速成为企业内部的得力助手。本文将深入探…

udp的广播,多播,单播 demo

enum class EMsgType:uint8_t { EMSGT_SINGLE,//单播 EMSGT_MULTICAST,//多播 EMSGT_BROADCAST,//广播 }; sendSocket new QUdpSocket(this); sendSocket->setSocketOption(QAbstractSocket::MulticastTtlOption, 1); sendSocket->bind(QHostAddress::AnyIPv4, 0,QUdpSoc…

Qt 弹出菜单右键菜单 QMenu 设置不同颜色的子项

概述 在Qt中,可以使用样式表(StyleSheet)来自定义 QMenu 的外观,包括其子项(如菜单项QAction)的颜色。但是,这通常可以设置 QMenu 的整体样式,而不能单独设置某个子项的颜色。不过&…

Redis:处理缓存穿透的两种方法

缓存穿透:客户端请求的数据在缓存和数据库中都不存在,这样缓存永远不能生效,请求都会直接发送到数据库 解决方案: 1.缓存空对象 查完数据库后,将该数据以空值缓存进redis中,同时增加命中时对命中空值的判…

【乐吾乐大屏可视化组态编辑器】使用手册

1 总览 开始设计:大屏可视化设计器 - 乐吾乐Le5le 1.1 画布 画布即绘画区域,将图形拖拽到画布进行编辑,绘制大屏。 1.2 菜单栏 顶部菜单导航,一级菜单可设置Logo、公司名称、文件编辑、常用编辑、查看、帮助,设置大…

尚品汇-订单拆单、支付宝关闭交易、关闭过期订单整合(五十)

目录: (1)拆单接口 (2)取消订单业务补充关闭支付记录 (3)支付宝关闭交易 (4)查询支付交易记录 (5)PaymentFeignClient 远程接口 &#xff08…