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

Oracle 数据库基础入门(二):深入理解表的约束

在 Oracle 数据库的学习进程中,表的约束是构建健壮、准确且高效数据库的关键要素。约束如同数据库的 “规则守护者”,它通过对数据的限制,确保了数据的完整性和一致性,就如同交通规则保障道路上车辆行驶的有序性一样。对于 Java 全栈开发者而言,熟练掌握 Oracle 数据库的约束知识,无论是在数据库设计、开发还是后续的维护中,都具有举足轻重的意义。接下来,让我们一同深入探索 Oracle 数据库中表的约束世界。

目录

一、主键约束

(一)作用

(二)设置方法

二、唯一约束

(一)作用

(二)设置方法

三、检查约束

(一)作用

(二)设置方法

四、非 NULL 约束

(一)作用

(二)设置方法

五、外键约束

(一)作用

(二)设置方法

六、默认约束

(一)作用

(二)设置方法

七、自增约束

八、未来在企业工作的小技巧


一、主键约束

(一)作用

  1. 非空限制:主键约束确保了主键字段的值不能为 NULL。在数据库中,主键作为唯一标识每一条记录的关键,若允许为空,就无法准确地定位和区分不同的记录。例如在一个学生信息表中,学生 ID 作为主键,不能为空,否则将无法确定该条记录对应的具体学生。
  2. 唯一性限制:主键的值在整个表中必须是唯一的,不能出现重复。这保证了每一条记录的独立性和可识别性。继续以学生信息表为例,如果有两个学生的 ID 相同,那么在查询和操作数据时,就会产生混淆,无法准确获取特定学生的信息。

(二)设置方法

  1. 建表时设置
Create table class_info(Id number(11)primary key,Class_name nvarchar2(20)
);

这种方式非常直观,在创建表的同时,明确指定了Id字段为主键,适用于新建表时对主键的定义。在 Java 全栈开发中,当设计数据库表结构与 Java 实体类对应时,这种清晰的主键定义方式有助于后续开发中数据的准确操作和映射。例如在 Spring Boot 项目中,通过 JPA(Java Persistence API)进行数据库操作时,明确的主键定义能确保数据的持久化和查询操作的正确性。

2. 表存在时修改添加

Alter table 表的表名 add constraint 约束名称 primary key(主键词);

其中,约束名称可以自行定义,为了便于管理和识别,通常命名为pk_字段名的形式,比如pk_id。这种方式适用于已经创建好表,但后续需要添加主键约束的情况。在企业项目中,可能会因为业务需求的变更,需要对已有的表添加主键约束,此时就可以使用这种方法。

二、唯一约束

(一)作用

唯一约束用于限制某一列的值在表中不能重复,适用于一些具有唯一性特征的数据列,如电话号码、ID 号码、登录名等。以电话号码为例,在一个客户信息表中,每个客户的电话号码应该是唯一的,通过唯一约束可以确保数据的准确性,避免出现重复电话号码导致的客户信息混淆。

(二)设置方法

  1. 建表时设置
Create table students(Id number(11)primary key,Stu_no varchar(11)unique,Stu_name nvarchar2(20)
);

在创建students表时,指定Stu_no字段具有唯一性约束,保证每个学生的学号不会重复。

2. 表存在时添加

alter table 表的表名 add constraint 约束名称 unique(唯一列); 

约束名称通常写成uk_字段名的形式,例如:

alter table students add constraint uk_stu_no unique(stu_no);

在企业开发中,当对已有表的数据完整性进行优化时,若发现某些字段需要具备唯一性,可以通过这种方式添加唯一约束。在 Java 全栈开发中,涉及到用户注册、数据录入等功能时,确保唯一约束的正确设置可以有效避免数据冲突,提高系统的稳定性和可靠性。

三、检查约束

(一)作用

检查约束用于限制某一列的值只能是规定的值,通过设定条件来确保数据的合理性。例如在学生信息表中,学生的年龄应该在一个合理的范围内,性别也应该是特定的取值。

(二)设置方法

  1. 建表时设置
create table students(id number(11) primary key,stu_no varchar(11) unique,stu_name nvarchar2(20),age number(3) check (age >=0 and age<= 200 ),gender char(3) check (gender in ('男','女'))
);

在创建students表时,对age字段设置了年龄范围的检查约束,对gender字段设置了性别取值的检查约束。在 Java 全栈开发中,前端页面输入的数据在保存到数据库之前,虽然会进行前端验证,但数据库层面的检查约束作为最后一道防线,能进一步确保数据的准确性,防止非法数据入库。

2. 表存在时添加

alter table 表的表名 add constraint 约束名称 check(检查的条件);

例如:

alter table students add constraint ck_age check(age >=0 and age<= 200 );
alter table students add constraint ck_gender check(gender in ('男','女') );

在企业项目中,当业务规则发生变化,需要对已有表的字段取值范围进行调整时,可以使用这种方式添加或修改检查约束。

四、非 NULL 约束

(一)作用

非 NULL 约束用于限制某一列必须为特定的值,即该列不能为 NULL。例如在学生信息表中,学生姓名这一列通常不能为空,因为一个没有姓名的学生记录是不完整且无意义的。

(二)设置方法

  1. 建表时设置
Create table students(Id number(11)primary key,Stu_no varchar(11)unique,Stu_name nvarchar2(20) not null,Age_number(3)check(age >=0 and age <= 200),Gender char(3) check (gender in ('Male','Female'))
);

在创建表时,直接在Stu_name字段定义后加上not null,确保该字段不能为空。在 Java 全栈开发中,与数据库交互时,通过这种约束可以保证从数据库读取的数据完整性,避免因空值导致的程序异常。

2. 表存在时修改添加

Alter table 表的表名 modify 字段名称 数据类型 [约束];

例如:

Alter table students modify stu_name nvarchar2(20) not null;

在企业开发中,当发现已有表中的某些字段需要确保非空时,可以使用这种方式进行修改。

五、外键约束

(一)作用

外键(Foreign Key)约束用于限制外键列的值必须在关联的父表中真实存在,它建立了表与表之间的关联关系,确保了数据的参照完整性。例如在一个班级信息表和学生信息表中,学生信息表中的班级 ID 字段作为外键,其值必须在班级信息表的班级 ID 列中存在,这样才能保证学生与班级的正确关联。

(二)设置方法

  1. 建表时设置
-- 父表
create table class_info(id number(11) primary key,class_name nvarchar2(20)
);
-- 子表
create table students(id number(11) primary key,stu_no varchar(11) unique,stu_name nvarchar2(20) not null,age number(3) check (age >=0 and age<= 200 ),gender char(3) check (gender in ('男','女')),fk_class_id number(11) constraint fk_cls_cons references class_info(id)
);

在创建students子表时,定义了fk_class_id字段作为外键,并通过constraint fk_cls_cons references class_info(id)指定其关联到class_info父表的id字段。在 Java 全栈开发中,涉及到多表关联查询和数据操作时,正确的外键约束设置是保证数据一致性和准确性的关键。例如在 Hibernate 框架中,通过映射文件或注解来配置实体类之间的关联关系,与数据库中的外键约束相对应,实现数据的正确持久化和查询。

2. 表存在时添加

alter table 子表 add constraint 约束名称 foreign key(外键字段) references 父表(id);

例如:

alter table students add constraint fk_cls_cons foreign key(fk_class_id) references class_info(id);

在企业项目中,当需要建立或修改表之间的关联关系时,可以使用这种方式添加外键约束。

六、默认约束

(一)作用

默认约束用于限制某一列,如果用户在插入数据时没有输入该列的值,则自动填充默认值。例如在用户信息表中,初始化密码(通常以密文形式存储)可以设置默认值,当用户注册时若未主动设置密码,系统会使用默认密码。

(二)设置方法

  1. 建表时设置
create table students(id number(11) primary key,stu_no varchar(11) unique,stu_name nvarchar2(20) not null,password char(32) default 'e10adc3949ba59abbe56e057f20f883e',age number(3) check (age >=0 and age<= 200 ),gender char(3) check (gender in ('男','女')),fk_class_id number(11) constraint fk_cls_cons references class_info(id)
);

在创建students表时,为password字段设置了默认值'e10adc3949ba59abbe56e057f20f883e'。在 Java 全栈开发中,当使用数据库操作框架进行数据插入时,默认约束可以简化代码逻辑,避免因未设置某些字段值而导致的错误。

2. 表存在时修改添加

alter table 表的表名 modify 字段名称 default 默认值;

例如:

alter table students modify password default 'e10adc3949ba59abbe56e057f20f883e';

在企业开发中,当业务需求发生变化,需要修改已有表中某些字段的默认值时,可以使用这种方式。

七、自增约束

在 Oracle 数据库中,Oracle11g 版本本身不带自增约束,而 12C 及以上版本具备自增功能。在 Oracle11g 及之前版本中,可以通过序列(Sequence)和触发器(Trigger)来实现自增效果。在其他关系型数据库中,针对Id字段通常都直接提供自增约束。

  1. 使用序列实现自增(以 Oracle11g 为例)
create sequence 序列名称 start with 起始值 increment by 步长值;

例如创建一个从 1 开始,每次增长 1 的序列stu_seq

create sequence stu_seq start with 1 increment by 1;

在插入数据时,使用序列的nextVal属性来获取下一个自增值:

insert into 表的表名(id,字段列表) values (序列名称.nextVal,值的列表);

例如向students表中插入数据:

insert into students(id,stu_name) values (stu_seq.nextVal,'');
insert into students(id,stu_name) values (stu_seq.nextVal,'');
insert into students(id,stu_name) values (stu_seq.nextVal,'');
insert into students(id,stu_name) values (stu_seq.nextVal,'');
insert into students(id,stu_name) values (stu_seq.nextVal,'');

在 Java 全栈开发中,若使用低版本 Oracle 数据库,在进行数据插入操作时,需要在 Java 代码中配合数据库的序列来生成自增 ID,确保数据插入的正确性。例如在 MyBatis 框架中,可以通过编写 SQL 语句来调用序列生成自增 ID 并插入数据。

八、未来在企业工作的小技巧

  1. 约束设计与业务需求紧密结合:在企业项目中,数据库表的约束设计要深入理解业务需求。例如在电商系统中,订单表的外键约束要与商品表、用户表等紧密关联,确保订单中的商品 ID 和用户 ID 的有效性,同时主键约束要保证每个订单的唯一性。在设计阶段,与业务团队充分沟通,明确数据的完整性要求,避免因约束不合理导致的数据错误和业务逻辑混乱。
  2. 约束的维护与优化:随着业务的发展,数据库表结构和数据量可能会发生变化,此时需要对约束进行维护和优化。例如当数据量增大时,某些唯一约束可能会影响插入性能,可以考虑使用索引来优化。定期检查约束的有效性,尤其是外键约束,确保关联表之间的数据一致性。在 Java 全栈开发中,当数据库表结构发生变化时,相应的 Java 实体类和数据库操作代码也需要同步调整,以保证与数据库约束的一致性。
  3. 约束与数据安全:约束不仅保证数据的完整性,也与数据安全密切相关。例如非 NULL 约束可以防止关键数据缺失,避免因数据不完整导致的安全漏洞。在企业中,涉及用户敏感信息的表,如用户密码字段,通过默认约束设置强密码策略的默认值,能提高系统的安全性。同时,在进行数据库操作时,要确保代码遵循数据库的约束规则,防止非法数据的写入。

通过对 Oracle 数据库表的约束的学习,我们进一步提升了数据库设计和管理的能力。在后续的学习中,我们将继续探索 Oracle 数据库的更多高级特性,为成为优秀的 Java 全栈开发者积累更丰富的知识。

相关文章:

Oracle 数据库基础入门(二):深入理解表的约束

在 Oracle 数据库的学习进程中&#xff0c;表的约束是构建健壮、准确且高效数据库的关键要素。约束如同数据库的 “规则守护者”&#xff0c;它通过对数据的限制&#xff0c;确保了数据的完整性和一致性&#xff0c;就如同交通规则保障道路上车辆行驶的有序性一样。对于 Java 全…...

DeepSeek掘金——DeepSeek-R1驱动的房地产AI代理

DeepSeek掘金——DeepSeek-R1驱动的房地产AI代理 本文探讨如何使用 Smolagents 和 DeepSeek-R1 构建房地产代理,并利用工具进行网页抓取和数据导出。 AI 代理对于自动化复杂的推理任务至关重要。Smolagents 是由 Hugging Face 开发的轻量级 AI 代理框架,允许将大型语言模型 …...

WebP2P技术在嵌入式设备中的应用:EasyRTC音视频通话SDK如何实现高效通信?

在数字化时代&#xff0c;实时通信技术&#xff08;RTC&#xff09;与人工智能&#xff08;AI&#xff09;的融合正在重塑各个行业的交互方式。从在线教育到远程医疗&#xff0c;从社交娱乐到企业协作&#xff0c;RTC的应用场景不断拓展。然而&#xff0c;传统的RTC解决方案往往…...

【零基础到精通Java合集】第三集:流程控制与数组

针对**“流程控制与数组”**的15分钟课程内容设计,聚焦代码逻辑设计与数据结构基础: 课程标题:流程控制与数组(15分钟) 目标:掌握分支/循环语法与数组操作,能编写条件判断与数据遍历程序 一、课程内容与时间分配 0-2分钟 课程目标与逻辑导图 明确学习目标:分支结构、…...

VsCode + EIDE + OpenOCD + STM32(野火DAP) 开发环境配置

VsCode EIDE OpenOCD STM32(野火DAP) 开发环境配置 接受了新时代编辑器的我&#xff0c;实在受不了Keil的上古编辑页面&#xff0c;周树人说过&#xff1a;由奢入俭难&#xff0c;下面我们一起折腾一下开源软件Vscode&#xff0c; 用以开发51和STM32&#xff0c;有错误之处&…...

【vue-echarts】——01.认识echarts

文章目录 前言一、echarts二、使用步骤1.vue cli创建项目并安装第三方模块echarts2.显示图表总结前言 定制的数据可视化图表。ECharts最初由百度团队开源,并于2018年初捐赠给Apache基金会,成为ASF孵化级项目。2021年1月26日晚,Apache基金会官方宣布ECharts项目正式毕业。 一…...

【http://noi.openjudge.cn/】4.3算法之图论——1538:Gopher II

[【http://noi.openjudge.cn/】4.3算法之图论——1538:Gopher II] 题目 查看提交统计提问 总时间限制: 2000ms 内存限制: 65536kB 描述 The gopher family, having averted the canine threat, must face a new predator. The are n gophers and m gopher holes, each at di…...

Linux常见操作命令

Linux系统拥有丰富的命令行工具&#xff0c;通过这些命令可以高效地完成各种系统管理和日常操作任务。以下是一些常见的Linux操作命令&#xff1a; 文件和目录操作&#xff1a; - 创建目录&#xff1a;使用 mkdir 命令&#xff0c;例如 mkdir test 可以创建名为 test 的目录。如…...

Linux下测试Wifi性能——2.Linux下wifi指令

一、前言 相关知识大家看前一章节 Linux下测试Wifi性能——1.Wifi相关知识-CSDN博客 二、指令 1.查找可用网卡 iw dev 其中 接口名称&#xff08;Interface&#xff09; p2p0 和 wlan0 都是无线接口&#xff08;网卡&#xff09;的名称。 wlan0 是常见的无线局域网接口名…...

(十 九)趣学设计模式 之 中介者模式!

目录 一、 啥是中介者模式&#xff1f;二、 为什么要用中介者模式&#xff1f;三、 中介者模式的实现方式四、 中介者模式的优缺点五、 中介者模式的应用场景六、 总结 &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢博主的讲解方式&#xff0c;…...

Leetcode 54: 螺旋矩阵

Leetcode 54: 螺旋矩阵 是一道经典的矩阵遍历模拟题目&#xff0c;要求我们以螺旋顺序遍历一个二维数组。这个问题在面试中非常经典&#xff0c;考察模拟、数组操作以及逻辑清晰度。掌握本题的高效解法可以迅速给面试官留下好印象。 适合面试的解法&#xff1a;边界法&#xff…...

abseil-cpp:环境搭建

参考: https://abseil.io/docs/cpp/quickstart-cmake abseil-cpp.git/dd4c89b abseil-cpp.git/20240722.1 1. clone代码仓库、编译 git clone https://github.com/abseil/abseil-cpp.git /app/abseil-cpp/ #/app/abseil-cpp/.git/config git checkout 20240722.1git rev-pa…...

Centos7部署k8s(单master节点安装)

单master节点部署k8s集群(Centos) 一、安装前准备 1、修改主机名 按照资源准备修改即可 # master01 hostnamectl set-hostname master01 ; bash # node1 hostnamectl set-hostname node1 ; bash # node2 hostnamectl set-hostname node2 ; bash2、修改hosts文件 以下命令所…...

RPA 职业前景:个人职场发展的 “新机遇”

1. RPA职业定义与范畴 1.1 RPA核心概念 机器人流程自动化&#xff08;RPA&#xff09;是一种通过软件机器人模拟人类操作&#xff0c;自动执行重复性、规则性任务的技术。RPA的核心在于其能够高效、准确地处理大量数据和流程&#xff0c;减少人工干预&#xff0c;从而提高工作…...

详解DeepSeek模型底层原理及和ChatGPT区别点

一、DeepSeek大模型原理 架构基础 DeepSeek基于Transformer架构,Transformer架构主要由编码器和解码器组成,在自然语言处理任务中,通常使用的是Transformer的解码器部分。它的核心是自注意力机制(Self - Attention),这个机制允许模型在处理输入序列时,关注序列中不同位…...

《2025年软件测试工程师面试》JAVA基础面试题

基础题 == 和 equals 的区别是什么? ==比较的是引用是否相同,比较的是对象的引用地址,如果比较的两个对象地址位不同,值相同也会返回falseequals()比较的是...

【算法学习之路】5.贪心算法

贪心算法 前言一.什么是贪心算法二.例题1.合并果子2.跳跳&#xff01;3. 老鼠和奶酪 前言 我会将一些常用的算法以及对应的题单给写完&#xff0c;形成一套完整的算法体系&#xff0c;以及大量的各个难度的题目&#xff0c;目前算法也写了几篇&#xff0c;题单正在更新&#xf…...

如何打造一个安全稳定的海外社媒账号?

您好&#xff01;随着TikTok、Instagram、Facebook等海外社媒平台的迅猛发展&#xff0c;越来越多的个人和企业希望借助这些平台实现全球化传播。然而&#xff0c;注册和运营海外社媒账号的过程中&#xff0c;许多人频繁遭遇到封禁、限制和账号关联等问题&#xff0c;常常导致严…...

【Python 数据结构 5.栈】

目录 一、栈的基本概念 1.栈的概念 2.入栈 入栈的步骤 3.出栈 出栈的步骤 4.获取栈顶元素 获取栈顶元素的步骤 二、 Python中的栈 顺序表实现 链表实现 三、栈的实战 1.LCR 123. 图书整理 I 思路与算法 2.LCR 027. 回文链表 思路与算法 3.1614. 括号的最大嵌套深度 思路与算法 …...

Qt开发⑪Qt网络+Qt音视频_使用实操

目录 1. Qt 网络 1.1 UDP Socket 1.2 TCP Socket 1.3 HTTP Client 2. Qt 音视频 2.1 Qt 音频 2.2 Qt 视频 本篇完。 1. Qt 网络 和多线程类似&#xff0c;Qt 为了支持跨平台, 对网络编程的 API 也进行了重新封装。 实际 Qt 开发中进行网络编程&#xff0c;也不一定使用…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...

提升移动端网页调试效率:WebDebugX 与常见工具组合实践

在日常移动端开发中&#xff0c;网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时&#xff0c;开发者迫切需要一套高效、可靠且跨平台的调试方案。过去&#xff0c;我们或多或少使用过 Chrome DevTools、Remote Debug…...

Vue3 PC端 UI组件库我更推荐Naive UI

一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用&#xff0c;前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率&#xff0c;还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库&#xff08;Naive UI、Element …...

何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡

何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡 背景 我们以建设星云智控官网来做AI编程实践&#xff0c;很多人以为AI已经强大到不需要程序员了&#xff0c;其实不是&#xff0c;AI更加需要程序员&#xff0c;普通人…...