Oracle主键和外键详解及实用技巧

2024-09-08 13:04

本文主要是介绍Oracle主键和外键详解及实用技巧,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在 Oracle 数据库中,主键(Primary Key)和外键(Foreign Key)用于维护数据库表之间的数据完整性。

1. 主键(Primary Key)

主键是一列或多列,能够唯一标识表中的每一行。表中只能有一个主键,并且主键列不能为空(即 NOT NULL)。

特性:
  • 唯一性:主键中的每一个值都是唯一的,不能重复。
  • 非空性:主键列不能包含 NULL 值。
  • 索引:Oracle 自动为主键创建唯一索引,提升查询性能。
常用操作:
  1. 创建表时指定主键

    CREATE TABLE employees (emp_id NUMBER PRIMARY KEY, emp_name VARCHAR2(100), department_id NUMBER
    );
    

    emp_id 列上创建了主键。

  2. 为现有表添加主键
    如果表已经存在,但还没有主键,可以使用 ALTER TABLE 命令添加主键。

    ALTER TABLE employees ADD CONSTRAINT pk_emp_id PRIMARY KEY (emp_id);
    
  3. 删除主键
    如果需要删除主键,可以使用以下语法:

    ALTER TABLE employees DROP PRIMARY KEY;
    
  4. 查看主键
    查询某张表的主键可以通过 USER_CONSTRAINTS 视图:

    SELECT constraint_name 
    FROM user_constraints 
    WHERE table_name = 'EMPLOYEES' AND constraint_type = 'P';
    

2. 外键(Foreign Key)

外键用于在两个表之间建立关联,通常是从一个表(子表)的列引用另一个表(父表)的主键。外键用来确保引用完整性,意味着外键列的值必须存在于父表的主键中。

特性:
  • 引用完整性:外键保证子表中的某些值在父表中必须存在。
  • 级联操作:在父表中删除或更新主键时,外键可以选择级联操作(CASCADE)。
常用操作:
  1. 创建表时指定外键
    在创建表时,可以同时指定外键约束:

    CREATE TABLE departments (department_id NUMBER PRIMARY KEY, department_name VARCHAR2(100)
    );CREATE TABLE employees (emp_id NUMBER PRIMARY KEY, emp_name VARCHAR2(100), department_id NUMBER,CONSTRAINT fk_department FOREIGN KEY (department_id) REFERENCES departments(department_id)
    );
    

    这里 employees 表中的 department_id 列是 departments 表的外键。

  2. 为现有表添加外键
    可以使用 ALTER TABLE 语句为已经存在的表添加外键:

    ALTER TABLE employees ADD CONSTRAINT fk_department FOREIGN KEY (department_id) REFERENCES departments(department_id);
    
  3. 删除外键
    如果需要删除外键,可以使用以下语法:

    ALTER TABLE employees DROP CONSTRAINT fk_department;
    
  4. 级联删除(ON DELETE CASCADE)
    当删除父表中的记录时,可以设置外键的行为,例如级联删除子表中的相关记录:

    ALTER TABLE employees ADD CONSTRAINT fk_department 
    FOREIGN KEY (department_id) 
    REFERENCES departments(department_id) 
    ON DELETE CASCADE;
    

    当父表 departments 中的 department_id 被删除时,employees 表中对应的行也会被删除。

  5. 查看外键
    查询某张表的外键可以通过 USER_CONSTRAINTS 视图:

    SELECT constraint_name 
    FROM user_constraints 
    WHERE table_name = 'EMPLOYEES' AND constraint_type = 'R';
    

3. 外键的约束选项

  • ON DELETE CASCADE:当父表中的主键记录被删除时,子表中相关的记录也自动删除。
  • ON DELETE SET NULL:当父表中的主键记录被删除时,子表中相关的外键列设置为 NULL。
  • ON UPDATE CASCADE:在 Oracle 中不支持此选项。

示例操作:

  1. 带外键和主键的表操作

    -- 创建部门表,包含主键
    CREATE TABLE departments (department_id NUMBER PRIMARY KEY, department_name VARCHAR2(100)
    );-- 创建员工表,包含外键引用
    CREATE TABLE employees (emp_id NUMBER PRIMARY KEY, emp_name VARCHAR2(100), department_id NUMBER,CONSTRAINT fk_department FOREIGN KEY (department_id) REFERENCES departments(department_id)ON DELETE CASCADE
    );
    
  2. 插入和删除数据时的外键行为

    -- 向父表插入数据
    INSERT INTO departments (department_id, department_name) VALUES (1, 'HR');
    INSERT INTO departments (department_id, department_name) VALUES (2, 'IT');-- 向子表插入数据
    INSERT INTO employees (emp_id, emp_name, department_id) VALUES (101, 'Alice', 1);
    INSERT INTO employees (emp_id, emp_name, department_id) VALUES (102, 'Bob', 2);-- 删除父表数据时,子表中的相关记录也会被删除
    DELETE FROM departments WHERE department_id = 1;
    

通过使用主键和外键,Oracle 数据库可以有效地维护数据的完整性和关联性。

这篇关于Oracle主键和外键详解及实用技巧的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1148189

相关文章

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

mac中资源库在哪? macOS资源库文件夹详解

《mac中资源库在哪?macOS资源库文件夹详解》经常使用Mac电脑的用户会发现,找不到Mac电脑的资源库,我们怎么打开资源库并使用呢?下面我们就来看看macOS资源库文件夹详解... 在 MACOS 系统中,「资源库」文件夹是用来存放操作系统和 App 设置的核心位置。虽然平时我们很少直接跟它打交道,但了

关于Maven中pom.xml文件配置详解

《关于Maven中pom.xml文件配置详解》pom.xml是Maven项目的核心配置文件,它描述了项目的结构、依赖关系、构建配置等信息,通过合理配置pom.xml,可以提高项目的可维护性和构建效率... 目录1. POM文件的基本结构1.1 项目基本信息2. 项目属性2.1 引用属性3. 项目依赖4. 构

Rust 数据类型详解

《Rust数据类型详解》本文介绍了Rust编程语言中的标量类型和复合类型,标量类型包括整数、浮点数、布尔和字符,而复合类型则包括元组和数组,标量类型用于表示单个值,具有不同的表示和范围,本文介绍的非... 目录一、标量类型(Scalar Types)1. 整数类型(Integer Types)1.1 整数字

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

Oracle数据库使用 listagg去重删除重复数据的方法汇总

《Oracle数据库使用listagg去重删除重复数据的方法汇总》文章介绍了在Oracle数据库中使用LISTAGG和XMLAGG函数进行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLO... 目录案例表第一种:使用wm_concat() + distinct去重聚合第二种:使用listagg,

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1

PyTorch使用教程之Tensor包详解

《PyTorch使用教程之Tensor包详解》这篇文章介绍了PyTorch中的张量(Tensor)数据结构,包括张量的数据类型、初始化、常用操作、属性等,张量是PyTorch框架中的核心数据结构,支持... 目录1、张量Tensor2、数据类型3、初始化(构造张量)4、常用操作5、常用属性5.1 存储(st

Python 中 requests 与 aiohttp 在实际项目中的选择策略详解

《Python中requests与aiohttp在实际项目中的选择策略详解》本文主要介绍了Python爬虫开发中常用的两个库requests和aiohttp的使用方法及其区别,通过实际项目案... 目录一、requests 库二、aiohttp 库三、requests 和 aiohttp 的比较四、requ

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情