Oracle 中的外键约束

2023-11-16

一、前言

在Oracle数据库中,外键是用来实现參照完整性的方法之中的一个。打个比喻。外键是指定义外键的表的列的值必须在还有一个表中出现。

被參照的表称之为父表(parent table),创建外键的表称之为子表(child table)。子表中的外键关联了父表中的主键。

外键能够在创建表时定义或者通过ALTER TABLE语句创建。

外键(FK)是用于建立或加强两个表数据之间的链接的一列或多列。

注意:

1、在用外键进行表之间的数据关联的时候,如果外键没有定义级联删除,只能先删除有外键定义的子表,才能能删除有被外键引用的基表。

2、如果外键定义了级联删除,删除了被外键引用的基表之后,对应的子表中的数据也没有了。如果只删除有外键定义的子表,则被外键引用的基表中的数据依旧存在。

二、具体应用

2.1、外键的创建

使用CREATE TABLE语句创建:

CREATE TABLE table_name
(
  column1 datatype null/not null,
  column2 datatype null/not null,
  ...

  CONSTRAINT fk_column
    FOREIGN KEY (column1, column2, ... column_n)
    REFERENCES parent_table (column1, column2, ... column_n)
);

使用ALTER TABLE 语句创建:

ALTER TABLE table_name
ADD CONSTRAINT constraint_name
   FOREIGN KEY (column1, column2, ... column_n)
   REFERENCES parent_table (column1, column2, ... column_n);

2.2、级联删除外键

使用CREAT TABLE语句定义级联删除:

CREATE TABLE table_name
(
  column1 datatype null/not null,
  column2 datatype null/not null,
  ...

  CONSTRAINT fk_column
     FOREIGN KEY (column1, column2, ... column_n)
     REFERENCES parent_table (column1, column2, ... column_n)
     ON DELETE CASCADE
);

使用ALTER TABLE语句定义级联删除:

ALTER TABLE products
ADD CONSTRAINT fk_supplier
  FOREIGN KEY (supplier_id)
  REFERENCES supplier(supplier_id)
  ON DELETE CASCADE;

2.3、删除外键

alter table  "表名" drop constraint "外键名"

或

alter table  "表名" drop primary key

2.4、禁用外键

ALTER TABLE table_name
DISABLE CONSTRAINT constraint_name;

三、demo 演示

-- 先创建一个表sm_grade
create table sm_grade(
gradeId number(8) not null primary key,
gradeName nvarchar2(20)
);
 
-- 再创建有外键的sm_student(和sm_grade的gradeId关联)
create table sm_student(
studentId number(8) not null primary Key,
studentName Nvarchar2(20),
gender Nvarchar2(2),
gradeId Number(8)
);
 
-- 添加外键,这种外键不会级联删除数据
alter table sm_student add constraint fk_gradeId foreign key(gradeId) references sm_grade(gradeId);
 
-- 正常插入一条数据
insert Into sm_grade select 1, 'grade1' from dual;
insert Into sm_student select 1001, 'wanglc', 'm', 1 from dual;
 
select * from sm_grade purge;
select * from sm_student purge;
 
-- 插入一条无外键引用的数据
insert Into sm_student select 1002, 'baby', 'm', 2 from dual; -- ORA-02291: 违反完整约束条件 (SYSTEM.FK_GRADEID) - 未找到父项关键字
 
-- 删除有外键的数据,删除的表有外键,可以正常删除
delete from sm_student where studentId = 1001;
-- 恢复有外键的数据
insert Into sm_student select 1001, 'wanglc', 'm', 1 from dual;
 
-- 删除存在外键引用的数据
delete from sm_grade where gradeId=1; -- ORA-02292: 违反完整约束条件 (SYSTEM.FK_GRADEID) - 已找到子记录
 
-- 删除的顺序很重要
delete from sm_student purge;
delete from sm_grade purge;
 
COMMIT;
 
-- 删除不会级联删除的外键,创建一个会级联删除的外键
ALTER TABLE sm_student DROP CONSTRAINT fk_gradeId;
alter table sm_student add constraint fk_gradeId foreign key(gradeId) references sm_grade(gradeId) ON DELETE CASCADE;
 
-- 准备数据
insert Into sm_grade select 1, 'grade1' from dual;
insert Into sm_student select 1001, 'wanglc', 'm', 1 from dual;
 
-- 因为有级联,可以删除基表,同时,引用表中也没有数据了
delete from sm_grade where gradeId=1;
COMMIT;
select * from sm_grade purge;
select * from sm_student purge;
 
-- 准备数据
insert Into sm_grade select 1, 'grade1' from dual;
insert Into sm_student select 1001, 'wanglc', 'm', 1 from dual;
 
-- 这种删除方式,基表中的数据依旧存在。
delete from sm_student where studentId = 1001;
COMMIT;
select * from sm_grade purge;
select * from sm_student purge;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Oracle 中的外键约束 的相关文章

  • 是否可以使用“WHERE”子句来选择SQL语句中的所有记录?

    晚上好 我很好奇是否可以在 SQL 语句中创建一个 WHERE 子句来显示所有记录 下面一些解释 随机 SQL 语句 Java JSP示例 正常情况 String SqlStatement SELECT FROM table example
  • UUID最大字符长度

    我们使用 UUID 作为 Oracle DB 的主键 并尝试确定 VARCHAR 的适当最大字符长度 显然这是 36 个字符 但我们注意到生成的 UUID 比这个长 长度最多为 60 个字符 有谁知道 UUID 的合适最大字符长度 RFC4
  • 从存储过程中的动态 SQL 获取结果

    我正在编写一个存储过程 需要在过程中动态构造 SQL 语句以引用传入的表名称 我需要让这个 SQL 语句返回一个结果 然后我可以在整个过程的其余部分中使用该结果 我尝试过使用临时表和所有内容 但我不断收到一条消息 提示我需要声明变量等 例如
  • 在 Oracle 中使用触发器记录对表的更改

    我的一门课有一个项目 当我们的两个表发生更改时 我们需要创建一个日志 插入 更新 删除 我们需要使用Oracle触发器和PL SQL 在日志文件中 我们需要记录用户ID 日期时间 IP地址和事件 插入 更新 删除 我知道如何设置触发器 但我
  • SQL 大表中的随机行(使用 where 子句)

    我有一个网站 人们可以在其中对汽车进行投票 向用户展示 4 辆汽车 他 她可以投票选出他们最喜欢的汽车 桌子cars有重要的列 car id int 10 not auto increment so has gaps views int 7
  • SQL Server 使用通配符加入并在第一个匹配处停止

    IF OBJECT ID tempdb TABLE1 IS NOT NULL DROP TABLE TABLE1 IF OBJECT ID tempdb TABLE2 IS NOT NULL DROP TABLE TABLE2 CREATE
  • 什么是 Oracle 数据集成器?

    什么是ODI ODI的实际用途是什么 oracle data integrator工具如何帮助编程 sql Developer 工具和 ODI 工具实际上有什么区别 真的厌倦了在某些网站上找到的定义 如果有人能提出 gud 解释 那就太好了
  • ROWNUM 的 OracleType 是什么

    我试图参数化所有现有的 sql 但以下代码给了我一个问题 command CommandText String Format SELECT FROM 0 WHERE ROWNUM lt maxRecords command CommandT
  • 将多行合并为一行并根据行数附加列

    我正在尝试将同一个表的多行合并为一个 我有一个像这样的示例表 Col1 Col2 Col3 Col4 Col5 Col6 1 BH1 CB 12 CC CC Conveyor Mal 1 BH1 CB 104 ZC ZC Full Emp
  • APEX:从临时表下载 BLOB

    我正在尝试使用 Oracle APEX 4 1 1 构建一个简单的查看应用程序 要显示的信息位于与包含 APEX 应用程序访问的架构的数据库不同的数据库上的表中 使用视图 View 访问此远程表 远程表视图 和数据库链接 视图按预期工作 包
  • 在存储过程结束时显式删除本地临时表有什么好处?

    考虑以下伪 T SQL 代码 由存储过程执行 CREATE TABLE localTable
  • SQL:查找每个跑步者跑步之间的平均天数

    因此 如果我们给出下表 runner ran Carol 2011 02 01 Alice 2011 02 01 Bob 2011 02 01 Carol 2011 02 02 Bob 2011 02 02 Bob 2011 02 03 B
  • 从一个sql服务器选择到另一个sql服务器?

    我想将一台服务器 Data Old S1 中的一个表 T1 在 DB1 中 中的数据选择到另一台服务器 Data Latest S2 中的另一个表 T2 在 DB2 中 中的数据 我怎样才能做到这一点 请注意服务器的命名方式 查询也应该考虑
  • SQLSTATE[HY000] [2002] 资源暂时不可用 - mysql - innodb 和 pdo

    在我的错误日志中得到大量结果 如下所列 数据库中的所有表都是 innodb 并且就与这些表的任何交互而言 一切都是带有准备好的语句的 pdo 正如我所说 所有错误几乎与下面列出的错误相同 但发生在几个不同的页面上 无论页面如何 错误行始终指
  • 与 FOREIGN KEY 约束冲突

    我有两张桌子 学术界 CREATE TABLE dbo R ACADEMIE ID ACADEMIE dbo IDENTIFIANT NOT NULL LC ACADEMIE CODE dbo LIBELLE COURT NOT NULL
  • 使用 xmlagg 时出现子查询错误和太多值

    我在连接许多大型表中的所有数据时遇到问题 我昨天对此提出了问题 但不幸的是 listagg 似乎不是一个好的选择 链接子查询返回多行 https stackoverflow com questions 54651144 subquery r
  • 如何在sqlite中添加特定数量的空行?

    我有一个SQLite文件 我想添加2550 empty NULL rows 我可以使用此代码添加一个空行 INSERT INTO my table DEFAULT VALUES 但我需要 2550 行 有什么捷径吗 我不想执行相同的代码 2
  • SQL Server递归查询显示父级路径

    我正在使用 SQL Server 语句并有一张表 例如 item value parentItem 1 2test 2 2 3test 3 3 4test 4 5 1test 1 6 3test 3 7 2test 2 我想使用 SQL S
  • 如何对 SQL Server Express 进行实时更改

    我一直在使用 VS studio 开发一个 ASP NET Web 应用程序 我正在使用 SQL Server Express 在开发过程中 我一直在我的服务器上测试我的网络应用程序 每次我需要更新数据库时 我都会简单地删除旧数据库 位于我
  • 部署 dacpac 所需的权限

    我正在尝试使用 sqlpackage exe 在租户上部署 dacpac 目前 我正在向将部署此功能的帐户授予 SysAdmin 或 db owner 权限 并且它工作正常 但在生产中 如果目标租户数据库属于其他应用程序 我可能无法获得这些

随机推荐

  • Ubuntu16.04安装JDK1.8详细步骤

    检测是否安装JDK root instance cqxyyrb2 java The program java can be found in the following packages default jre gcj 5 jre head
  • WebView加载h5页面弹窗无法显示问题和申请摄像头权限问题做个记录

    参考文章 WebView 加载H5页面空白问题 WebView使用getUserMedia 首先需要设置webview支持js 在Android 9 0后 访问地址如果是http开头的 还需要在配置文件里设置允许http访问 android
  • mybatis入门到熟练(一)

    一 创建一个空的maven项目 使用idea创建一个空的maven项目 引入依赖
  • 0x0000000000指令引用的0x00000000内存。该内存不能为read

    1 不知道是某个软件导致 进入CMD命令提示符 输入for 1 in windir system32 ocx do regsvr32 s 1再输入 for 1 in windir system32 dll do regsvr32 s 1 2
  • 华为OD机试真题 Java 实现【文件目录大小】【2023 B卷 100分】,附详细解题思路

    目录 专栏导读 一 题目描述 二 输入描述 三 输出描述 四 解题思路 五 Java算法源码 六 效果展示 1 输入 2 输出 3 说明 4 再输入 5 再输出 6 说明 华为OD机试 2023B卷题库疯狂收录中 刷题点这里 专栏导读 本专
  • python竖线_python对齐竖线

    广告关闭 腾讯云11 11云上盛惠 精选热门产品助力上云 云服务器首年88元起 买的越多返的越多 最高返5000元 大多数编辑器都会自动对齐后续参数列表行 使其缩进程度与你给第一个参数列表行指定的缩进程度相同 def function na
  • Java web 学习笔记

    Java Web 1 web基础 1 1 基本概念 web开发 网页开发 分为 静态web 和 动态web 静态web 由 html css JavaScript 共同组成 提供给所有人看 数据永远不变 动态web 提供给所有人看的数组 在
  • Spring Security Oauth2系列(一)

    前言 关于oauth2 其实是一个规范 本文重点讲解spring对他进行的实现 如果你还不清楚授权服务器 资源服务器 认证授权等基础概念 可以移步理解OAuth 2 0 阮一峰 这是一篇对于oauth2很好的科普文章 需要对spring s
  • MySQL之常见的CRUD面试题【上】

    Welcome Huihui s Code World 接下来看看由辉辉所写的关于MySQL数据库的相关操作吧 目录 Welcome Huihui s Code World 导读 一 数据库的连表查询是什么 二 连表查询有几种常见类型 1
  • 架构-大数据架构-阿里

    大数据架构 大数据框架从0到1整个过程的实现 根据本博客内容 可以实现整个大数据基本搭建 只是大概步骤 供学习参考 本博客从下面5个方面介绍 技术框架 技术选型 系统架构设计 业务流程 生态实现步骤 以阿里为例的大数据架构 通过学习视频 然
  • html里面行高的原理,CSS行高(line-height)及文本垂直居中原理

    在CS多现业讲进行效通近年有务这行定果过近年有S中 line height 属性设置两段段文本之间的距离 也就是行高 如果我们把一段文本的line height设置为父容器的高度就可以实现文本垂直居中了 比如二 都过发宗发数前业很断屏击和公
  • 基于AAEncode编码的解密经历

    有天 正在干活 领导突然发了一个静态页面 说通过办公网流量获取的一个url 可以查询公司所有员工的靓照 截图如下 这极大的引发了我们安全部门的高度重视 立马对页面进行了分析
  • 关于RDF的技术支持和应用部分示例

    1 RDF的应用 Mozilla XUL XML User Interface http www mozilla org rdf doc faq html xul templates IBM ORIENT by IBM CRL http w
  • Linux读写GPIO的几种方法及一些有趣的应用

    Linux读写GPIO的几种方法及一些有趣的应用 Yihui 在智能音箱的设计中 最近在写LED的控制 触摸按键的检测 这不就是在Linux下读写GPIO 太简单吧 很多人就不屑一顾了 不过 简单读写IO也可以玩出花来 得到意外的惊喜 这里
  • 江苏省对口单招计算机原理,江苏省对口单招计算机原理教案

    第三章CPU 指令系统 总线系统 一 填空题 1 指令由 和 两部分组成 2 指令中的 指明完成操作所需要的操作数的地址 3 根据地址码部分所给出的地址的个数可将指令分为 二地址指令 三地址指令等 4 指令的寻址方式与操作数可存放的位置及存
  • springboot_读取自定义配置的两种方式

    一 核心配置文件 核心配置文件是指在resources根目录下的application properties或application yml配置文件 我们写自定义配置也一般写在这个文件里 但实际上我们为了方便区分和管理 我们可以自己新建一个
  • 从结果集中取出某一列的值组装成新的数组

    从结果集中取出某一列的值组装成新的数组 package main import fmt func main data map string string name z age 18 sex nan name l age 19 sex nv
  • 【导航算法】S型速度规划笔记

    S型速度规划笔记 一 S型速度规划逻辑整理 1 根据q1 q0和速度 判断是否在约束条件下 可以规划出S型速度规划 2 假设可以找到合适的S型速度规划 确定相应的参数v max和a max a 判断是否可以达到最大速度 v max 和加速度
  • Nacos用做配置中心时启动报错SocketTimeoutException http://localhost:8848

    当使用nacos作为注册中心时 很顺利 进如下配置 仅仅配置了ip和端口 启动类加 EnableDiscoveryClient注解 nacos作为配置中心 当继续将nacos作为配置中心时 添加加依赖
  • Oracle 中的外键约束

    一 前言 在Oracle数据库中 外键是用来实现參照完整性的方法之中的一个 打个比喻 外键是指定义外键的表的列的值必须在还有一个表中出现 被參照的表称之为父表 parent table 创建外键的表称之为子表 child table 子表中