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 中的外键约束 的相关文章

随机推荐

  • 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 子表中