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

相关文章

Debezium 与 Apache Kafka 的集成方式步骤详解

《Debezium与ApacheKafka的集成方式步骤详解》本文详细介绍了如何将Debezium与ApacheKafka集成,包括集成概述、步骤、注意事项等,通过KafkaConnect,D... 目录一、集成概述二、集成步骤1. 准备 Kafka 环境2. 配置 Kafka Connect3. 安装 D

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

Spring Cloud LoadBalancer 负载均衡详解

《SpringCloudLoadBalancer负载均衡详解》本文介绍了如何在SpringCloud中使用SpringCloudLoadBalancer实现客户端负载均衡,并详细讲解了轮询策略和... 目录1. 在 idea 上运行多个服务2. 问题引入3. 负载均衡4. Spring Cloud Load

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

在 Spring Boot 中使用 @Autowired和 @Bean注解的示例详解

《在SpringBoot中使用@Autowired和@Bean注解的示例详解》本文通过一个示例演示了如何在SpringBoot中使用@Autowired和@Bean注解进行依赖注入和Bean... 目录在 Spring Boot 中使用 @Autowired 和 @Bean 注解示例背景1. 定义 Stud

oracle DBMS_SQL.PARSE的使用方法和示例

《oracleDBMS_SQL.PARSE的使用方法和示例》DBMS_SQL是Oracle数据库中的一个强大包,用于动态构建和执行SQL语句,DBMS_SQL.PARSE过程解析SQL语句或PL/S... 目录语法示例注意事项DBMS_SQL 是 oracle 数据库中的一个强大包,它允许动态地构建和执行

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I

Go路由注册方法详解

《Go路由注册方法详解》Go语言中,http.NewServeMux()和http.HandleFunc()是两种不同的路由注册方式,前者创建独立的ServeMux实例,适合模块化和分层路由,灵活性高... 目录Go路由注册方法1. 路由注册的方式2. 路由器的独立性3. 灵活性4. 启动服务器的方式5.

Java中八大包装类举例详解(通俗易懂)

《Java中八大包装类举例详解(通俗易懂)》:本文主要介绍Java中的包装类,包括它们的作用、特点、用途以及如何进行装箱和拆箱,包装类还提供了许多实用方法,如转换、获取基本类型值、比较和类型检测,... 目录一、包装类(Wrapper Class)1、简要介绍2、包装类特点3、包装类用途二、装箱和拆箱1、装