当前位置: 首页 > news >正文

Oracle 第7章:数据完整性约束

在Oracle数据库中,数据完整性是指确保存储在数据库中的数据的正确性和一致性。为了实现这一点,Oracle提供了多种机制来维护数据完整性,包括主键(Primary Key)、外键(Foreign Key)和唯一性约束(Unique Constraint)等。

主键(Primary Key)

主键是一个或一组字段,用于唯一标识表中的每一行记录。一个表只能有一个主键,并且主键不能包含NULL值。创建主键可以使用ALTER TABLE语句或者在创建表时直接定义。

示例代码:

-- 创建表并定义主键
CREATE TABLE Employees (EmployeeID NUMBER(4) CONSTRAINT emp_id_pk PRIMARY KEY,FirstName VARCHAR2(50),LastName VARCHAR2(50)
);-- 或者对已存在的表添加主键约束
ALTER TABLE Employees ADD CONSTRAINT emp_id_pk PRIMARY KEY (EmployeeID);

外键(Foreign Key)

外键是一个字段或一组字段,它的值必须与另一个表的主键的值相匹配。外键用来在两个表之间建立关系,确保引用完整性。外键可以指向其他表的主键或唯一键。

示例代码:

-- 创建部门表
CREATE TABLE Departments (DepartmentID NUMBER(4) CONSTRAINT dept_id_pk PRIMARY KEY,DepartmentName VARCHAR2(50)
);-- 创建员工表,并定义外键
CREATE TABLE Employees (EmployeeID NUMBER(4) CONSTRAINT emp_id_pk PRIMARY KEY,FirstName VARCHAR2(50),LastName VARCHAR2(50),DepartmentID NUMBER(4) CONSTRAINT emp_dept_fk REFERENCES Departments(DepartmentID)
);

唯一性约束(Unique Constraint)

唯一性约束用于保证表中的某一列或多列组合的值的唯一性。与主键不同的是,唯一性约束允许列中有NULL值。

示例代码:

-- 创建表并定义唯一性约束
CREATE TABLE Customers (CustomerID NUMBER(4),Email VARCHAR2(50) CONSTRAINT cust_email_uq UNIQUE
);-- 或者对已存在的表添加唯一性约束
ALTER TABLE Customers ADD CONSTRAINT cust_email_uq UNIQUE (Email);

这些约束是维护数据库中数据完整性的基础。通过使用这些约束,可以有效地防止数据冗余和不一致的情况发生。同时,它们也有助于简化应用程序逻辑,因为很多数据一致性检查可以直接由数据库管理系统来完成。然而,在设计数据库模式时需要谨慎地选择合适的约束类型,以确保既能满足业务需求又不会过度限制数据的灵活性。

检查约束(CHECK)

检查约束用来确保列中的值符合特定条件。它可以是一个简单的条件表达式,也可以是一个复杂的逻辑判断。如果插入或更新的数据不符合这个条件,则操作将失败。

示例代码:

-- 创建表并定义检查约束
CREATE TABLE Orders (OrderID NUMBER(4) CONSTRAINT ord_id_pk PRIMARY KEY,OrderDate DATE,Amount NUMBER(8, 2) CONSTRAINT ord_amount_ck CHECK (Amount > 0)
);-- 对已存在的表添加检查约束
ALTER TABLE Orders ADD CONSTRAINT ord_amount_ck CHECK (Amount > 0);

在这个例子中,CHECK (Amount > 0) 确保了订单金额总是正数。

默认值(DEFAULT)

默认值约束允许为特定的列指定一个默认值。当插入新行时如果没有为该列提供值,则自动使用默认值填充。

示例代码:

-- 创建表并定义默认值
CREATE TABLE Orders (OrderID NUMBER(4) CONSTRAINT ord_id_pk PRIMARY KEY,OrderDate DATE DEFAULT SYSDATE,Status VARCHAR2(15) DEFAULT 'New'
);-- 修改表添加默认值约束
ALTER TABLE Orders MODIFY Status VARCHAR2(15) DEFAULT 'New';

这里,OrderDate 的默认值是系统当前日期 SYSDATE,而 Status 的默认值是 'New'

非空约束(NOT NULL)

非空约束确保某列不允许为空值。通常情况下,主键会自动具有非空约束,但其他列也可以指定此约束。

示例代码:

-- 创建表并定义非空约束
CREATE TABLE Orders (OrderID NUMBER(4) CONSTRAINT ord_id_pk PRIMARY KEY,CustomerID NUMBER(4) CONSTRAINT ord_cust_id_nn NOT NULL
);-- 对已存在的表添加非空约束
ALTER TABLE Orders MODIFY CustomerID NUMBER(4) CONSTRAINT ord_cust_id_nn NOT NULL;

在上面的例子中,CustomerID 必须总是有值。

触发器(TRIGGER)

虽然触发器不是一种约束,但它可以用来强制执行某些规则,这些规则可能无法通过简单的DDL语句来实现。触发器可以在特定事件(如INSERT、UPDATE或DELETE)发生时自动执行。

示例代码:

-- 创建一个触发器来自动设置订单状态为 'Processed'
CREATE OR REPLACE TRIGGER process_order
AFTER UPDATE OF Status ON Orders
FOR EACH ROW
WHEN (NEW.Status = 'Processed')
BEGIN-- 执行相关处理逻辑
END;
/

这个触发器会在Orders表中的Status列为Processed时激活,你可以在此执行任何需要的逻辑。

以上就是关于Oracle数据库中数据完整性的一些补充信息。这些机制可以帮助确保数据的一致性和可靠性,同时减少应用程序中需要处理的错误情况。

管理约束

一旦在数据库中定义了约束,就需要对其进行管理,包括启用、禁用、验证等操作。

启用和禁用约束

约束默认是在创建时启用的,但在某些情况下,例如进行大量的数据导入或迁移时,可能会临时禁用约束以提高性能。

示例代码:

-- 禁用约束
ALTER TABLE Orders DISABLE CONSTRAINT ord_cust_id_nn;-- 重新启用约束
ALTER TABLE Orders ENABLE CONSTRAINT ord_cust_id_nn;
验证约束

当约束被定义为DEFERRED时,它不会立即验证约束条件是否满足,而是在事务提交时进行验证。但是,可以通过显式验证来立即检查约束条件。

示例代码:

-- 显式验证约束
ALTER TABLE Orders MODIFY CONSTRAINT ord_cust_id_nn IMMEDIATE;

约束验证

当插入或更新数据时,Oracle会自动检查所有相关约束的有效性。如果数据违反了任何约束,操作将会失败,并返回错误消息。

最佳实践

  1. 合理设计约束:在设计阶段,应该明确哪些字段需要约束,并且选择正确的约束类型。合理的约束设计可以避免数据不一致的问题。

  2. 性能考量:虽然约束可以提高数据的一致性,但是在高并发写入场景下,过多的约束可能会影响性能。因此,在设计时也需要考虑性能影响。

  3. 定期检查约束:随着时间推移,数据库可能会经历各种变更,定期检查约束的有效性和适用性是很重要的。

  4. 文档化:确保所有的约束都有详细的文档说明,这对于维护人员理解和维护数据库是非常有用的。

  5. 使用工具辅助管理:Oracle提供了多种工具和功能来帮助管理和优化约束,比如SQL*Plus、PL/SQL Developer、Enterprise Manager等。

触发器的最佳实践

当使用触发器来维护数据完整性时,有一些额外的注意事项:

  • 避免复杂逻辑:尽量保持触发器逻辑简单,复杂的逻辑可能会导致难以调试的问题。
  • 性能优化:触发器在每次表上发生特定事件时都会运行,因此应该注意其性能影响。
  • 测试:触发器应当经过充分测试,特别是在生产环境中部署之前。

通过上述方法和技术的应用,可以有效地确保Oracle数据库中的数据完整性,并维持系统的稳定性和可靠性。对于更复杂的数据完整性和业务逻辑要求,可能还需要结合存储过程、函数等其他数据库特性来共同实现。

相关文章:

Oracle 第7章:数据完整性约束

在Oracle数据库中,数据完整性是指确保存储在数据库中的数据的正确性和一致性。为了实现这一点,Oracle提供了多种机制来维护数据完整性,包括主键(Primary Key)、外键(Foreign Key)和唯一性约束&a…...

【核心】静态/动态全覆盖路径规划相关技术研究

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言一、明确覆盖式路径的目标二、静态/动态全覆盖路径规划相关技术研究(1)静态全覆盖路径规划方法一:波前WaveFront 覆盖算法方法二:图形学映射算…...

Java 实现集成 Google 邮箱第三方登录实践

文章目录 前言前期准备配置客户端 ID 和重定向 URL配置 OAuth 权限请求页面 登录流程前端演示代码后端演示代码 总结个人简介 前言 Google OAuth 2.0 是其中一种常见的第三方登录方式,广泛应用于各类网站和应用程序。通过 Google OAuth 2.0,用户可以使用…...

人人都在学的智能体(AI Agent),带你轻松入门!

一、智能体初认知 AI 智能体(英文:AI Agent)究竟是个啥 先讲个故事 想象一下,你有一个特别能干的虚拟助手,我们叫他小明。小明不是普通人,他是一个智能体,就像一个超级版的 Siri 或者小爱同学&…...

如何在Windows环境下开启Kibana的非localhost访问

Kibana是一个开源的分析和可视化平台,用于探索和可视化Elasticsearch数据。默认情况下,Kibana仅允许在本地访问,但通过一些简单的配置更改,你可以允许远程访问。在本文中,我们将介绍如何在Windows环境下开启Kibana的非…...

蓝桥杯 单片机 DS1302和DS18B20

DS1302 时钟 时钟试题 常作为实验室考核内容 控制三个引脚 P17 时钟 P23输入 P13复位 其他已经配置好 寄存器原理 定位地址 0x80地址 固定格式 0x57 5*107*1 57 小时写入格式 不同 首位区分 A上午 P下午 0为24小时制 1为12小时制 写入8小时 0x87 //1000 7 十二小时制 7…...

前端css-媒体查询@media以及常见使用例子

媒体查询(media)介绍 媒体查询(media)是 CSS 中用来针对不同的设备特性(如屏幕尺寸、分辨率等)应用不同样式的一种技术。通过媒体查询,可以使页面在不同设备上呈现不同的布局,实现响…...

centos系统防火墙SELinux设置指令

SELinux(Security-Enhanced Linux)的配置可以通过一系列步骤和命令来完成。以下是一些基本的配置SELinux的方法和步骤: 一、查看SELinux状态 首先,你需要查看SELinux的当前状态。可以使用以下命令: getenforce 该命…...

记录如何在RK3588板子上跑通paddle的OCR模型

官网文档地址 rknn_zoo RKNPU2_SDK RKNN Model Zoo 一、PC电脑是Ubuntu22.04系统中完成环境搭建(板子是20.04) 安装模型转换环境 ​conda create -n rknn2 python3.10 conda activate rknn2 安装Ubuntu依赖包 su…...

通过AWS Bedrock探索 Claude 的虚拟桌面魔力:让 AI 代替你动手完成任务!

前言 大家好,昨夜Anthropic 发布了更新。现在 Claude 3.5 Sonnet(V2) 和 Claude 3.5 Haiku,以及名为 computer use 的新功能已经作为公开测试版发布了。 Introducing computer use, a new Claude 3.5 Sonnet, and Claude 3.5 Ha…...

Java面向对象编程高阶(一)

Java面向对象编程高阶(一) 一、关键字static1、static修饰属性2、静态变量与实例变量的对比3、static修饰方法4、什么时候将属性声明为静态的?5、什么时候将属性声明为静态的?6、代码演示 一、关键字static static用来修饰的结构…...

JavaScript 中 let 和 var 的区别

JavaScript 中 let 和 var 的区别 在 JavaScript 中,let 和 var 都是用来声明变量的关键字,但它们在作用域、提升(hoisting)和重新赋值方面存在显著差异。理解这些差异对于编写高效和无bug的JavaScript代码至关重要。 作用域 v…...

React第十一章(useReducer)

useReducer useReducer是React提供的一个高级Hook,没有它我们也可以正常开发,但是useReducer可以使我们的代码具有更好的可读性,可维护性。 useReducer 跟 useState 一样的都是帮我们管理组件的状态的,但是呢与useState不同的是 useReducer…...

VUE3实现古典音乐网站源码模板

文章目录 1.设计来源1.1 网站首页页面1.2 古典音乐页面1.3 著名人物页面1.4 古典乐器页面1.5 历史起源页面1.6 登录页面1.7 注册页面 2.效果和源码2.1 动态效果2.2 目录结构 源码下载万套模板,程序开发,在线开发,在线沟通 作者:xc…...

1.nginx安装【Docker】

一、 拉取 最新 nginx 镜像 docker pull nginx二、 拷贝配置文件 2.1 目的 【数据持久化】容器被删除时,它内部的所有数据也会丢失。通过将数据目录挂载到宿主机,可以确保重要数据得到持久化保存 【方便数据管理和调试】通过卷挂载,可以直接…...

Linux -- 共享内存(1)

目录 共享内存 共享内存相关函数 ftok 函数 -- 获取 key 值 什么是 key? 如何生成 key ? 参数: 返回值: 封装: shmget 函数 -- 获取 shmid 值 什么是 shmid? shmid 和 key 的区别? …...

冒泡排序和二分查找--go

冒泡排序的逻辑 二分查找的逻辑 func bubbleSort(arr *[5]int){//冒泡排序fmt.Println(*arr)temp : 0for j : len(*arr); j > 0; j-- {for i : 0; i < j-1; i {temp (*arr)[i]if((*arr)[i] > (*arr)[i1]){(*arr)[i] (*arr)[i1](*arr)[i1] temp}}} }func binaryF…...

springboot RedisTemplate支持多个序列化方式

前提纪要&#xff1a;因为业务变动&#xff0c;需要在原先只支持protobuf的前提序列化的前提下&#xff0c;新增正常的序列化读取数据所以在原先的基础上进行优化。文章用于记忆。 话不多说直接上代码 Configuration AutoConfigureAfter(RedisAutoConfiguration.class) Import…...

开源项目-拍卖管理系统

哈喽&#xff0c;大家好&#xff0c;今天主要给大家带来一个开源项目-拍卖管理系统 拍卖管理系统主要有拍卖品管理&#xff0c;我的拍卖&#xff0c;拍卖详情&#xff0c;拍卖品信息修改&#xff0c;发布拍卖品等功能 登录 拍卖商品管理 主要用于查看、竞拍拍卖商品的信息 我…...

Python小游戏14——雷霆战机

首先&#xff0c;你需要确保安装了Pygame库。如果你还没有安装&#xff0c;可以使用pip来安装&#xff1a; bash pip install pygame 代码如下&#xff1a; python import pygame import sys import random # 初始化Pygame pygame.init() # 设置屏幕大小 screen_width 800 scr…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...