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作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

MyBatis常用XML语法详解

《MyBatis常用XML语法详解》文章介绍了MyBatis常用XML语法,包括结果映射、查询语句、插入语句、更新语句、删除语句、动态SQL标签以及ehcache.xml文件的使用,感兴趣的朋友跟随小... 目录1、定义结果映射2、查询语句3、插入语句4、更新语句5、删除语句6、动态 SQL 标签7、ehc

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

Redis 基本数据类型和使用详解

《Redis基本数据类型和使用详解》String是Redis最基本的数据类型,一个键对应一个值,它的功能十分强大,可以存储字符串、整数、浮点数等多种数据格式,本文给大家介绍Redis基本数据类型和... 目录一、Redis 入门介绍二、Redis 的五大基本数据类型2.1 String 类型2.2 Hash

Java中的.close()举例详解

《Java中的.close()举例详解》.close()方法只适用于通过window.open()打开的弹出窗口,对于浏览器的主窗口,如果没有得到用户允许是不能关闭的,:本文主要介绍Java中的.... 目录当你遇到以下三种情况时,一定要记得使用 .close():用法作用举例如何判断代码中的 input