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

相关文章

MySQL中的分组和多表连接详解

《MySQL中的分组和多表连接详解》:本文主要介绍MySQL中的分组和多表连接的相关操作,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录mysql中的分组和多表连接一、MySQL的分组(group javascriptby )二、多表连接(表连接会产生大量的数据垃圾)MySQL中的

Java 实用工具类Spring 的 AnnotationUtils详解

《Java实用工具类Spring的AnnotationUtils详解》Spring框架提供了一个强大的注解工具类org.springframework.core.annotation.Annot... 目录前言一、AnnotationUtils 的常用方法二、常见应用场景三、与 JDK 原生注解 API 的

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

SpringBoot3.4配置校验新特性的用法详解

《SpringBoot3.4配置校验新特性的用法详解》SpringBoot3.4对配置校验支持进行了全面升级,这篇文章为大家详细介绍了一下它们的具体使用,文中的示例代码讲解详细,感兴趣的小伙伴可以参考... 目录基本用法示例定义配置类配置 application.yml注入使用嵌套对象与集合元素深度校验开发

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

Java Stream流使用案例深入详解

《JavaStream流使用案例深入详解》:本文主要介绍JavaStream流使用案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录前言1. Lambda1.1 语法1.2 没参数只有一条语句或者多条语句1.3 一个参数只有一条语句或者多

SpringBoot整合mybatisPlus实现批量插入并获取ID详解

《SpringBoot整合mybatisPlus实现批量插入并获取ID详解》这篇文章主要为大家详细介绍了SpringBoot如何整合mybatisPlus实现批量插入并获取ID,文中的示例代码讲解详细... 目录【1】saveBATch(一万条数据总耗时:2478ms)【2】集合方式foreach(一万条数

Python装饰器之类装饰器详解

《Python装饰器之类装饰器详解》本文将详细介绍Python中类装饰器的概念、使用方法以及应用场景,并通过一个综合详细的例子展示如何使用类装饰器,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录1. 引言2. 装饰器的基本概念2.1. 函数装饰器复习2.2 类装饰器的定义和使用3. 类装饰

MySQL 中的 JSON 查询案例详解

《MySQL中的JSON查询案例详解》:本文主要介绍MySQL的JSON查询的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 的 jsON 路径格式基本结构路径组件详解特殊语法元素实际示例简单路径复杂路径简写操作符注意MySQL 的 J

Python ZIP文件操作技巧详解

《PythonZIP文件操作技巧详解》在数据处理和系统开发中,ZIP文件操作是开发者必须掌握的核心技能,Python标准库提供的zipfile模块以简洁的API和跨平台特性,成为处理ZIP文件的首选... 目录一、ZIP文件操作基础三板斧1.1 创建压缩包1.2 解压操作1.3 文件遍历与信息获取二、进阶技