Oracle 数据库基础入门(二):深入理解表的约束
在 Oracle 数据库的学习进程中,表的约束是构建健壮、准确且高效数据库的关键要素。约束如同数据库的 “规则守护者”,它通过对数据的限制,确保了数据的完整性和一致性,就如同交通规则保障道路上车辆行驶的有序性一样。对于 Java 全栈开发者而言,熟练掌握 Oracle 数据库的约束知识,无论是在数据库设计、开发还是后续的维护中,都具有举足轻重的意义。接下来,让我们一同深入探索 Oracle 数据库中表的约束世界。
目录
一、主键约束
(一)作用
(二)设置方法
二、唯一约束
(一)作用
(二)设置方法
三、检查约束
(一)作用
(二)设置方法
四、非 NULL 约束
(一)作用
(二)设置方法
五、外键约束
(一)作用
(二)设置方法
六、默认约束
(一)作用
(二)设置方法
七、自增约束
八、未来在企业工作的小技巧
一、主键约束
(一)作用
- 非空限制:主键约束确保了主键字段的值不能为 NULL。在数据库中,主键作为唯一标识每一条记录的关键,若允许为空,就无法准确地定位和区分不同的记录。例如在一个学生信息表中,学生 ID 作为主键,不能为空,否则将无法确定该条记录对应的具体学生。
- 唯一性限制:主键的值在整个表中必须是唯一的,不能出现重复。这保证了每一条记录的独立性和可识别性。继续以学生信息表为例,如果有两个学生的 ID 相同,那么在查询和操作数据时,就会产生混淆,无法准确获取特定学生的信息。
(二)设置方法
- 建表时设置:
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 号码、登录名等。以电话号码为例,在一个客户信息表中,每个客户的电话号码应该是唯一的,通过唯一约束可以确保数据的准确性,避免出现重复电话号码导致的客户信息混淆。
(二)设置方法
- 建表时设置:
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 全栈开发中,涉及到用户注册、数据录入等功能时,确保唯一约束的正确设置可以有效避免数据冲突,提高系统的稳定性和可靠性。
三、检查约束
(一)作用
检查约束用于限制某一列的值只能是规定的值,通过设定条件来确保数据的合理性。例如在学生信息表中,学生的年龄应该在一个合理的范围内,性别也应该是特定的取值。
(二)设置方法
- 建表时设置:
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。例如在学生信息表中,学生姓名这一列通常不能为空,因为一个没有姓名的学生记录是不完整且无意义的。
(二)设置方法
- 建表时设置:
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 列中存在,这样才能保证学生与班级的正确关联。
(二)设置方法
- 建表时设置:
-- 父表
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);
在企业项目中,当需要建立或修改表之间的关联关系时,可以使用这种方式添加外键约束。
六、默认约束
(一)作用
默认约束用于限制某一列,如果用户在插入数据时没有输入该列的值,则自动填充默认值。例如在用户信息表中,初始化密码(通常以密文形式存储)可以设置默认值,当用户注册时若未主动设置密码,系统会使用默认密码。
(二)设置方法
- 建表时设置:
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
字段通常都直接提供自增约束。
- 使用序列实现自增(以 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 并插入数据。
八、未来在企业工作的小技巧
- 约束设计与业务需求紧密结合:在企业项目中,数据库表的约束设计要深入理解业务需求。例如在电商系统中,订单表的外键约束要与商品表、用户表等紧密关联,确保订单中的商品 ID 和用户 ID 的有效性,同时主键约束要保证每个订单的唯一性。在设计阶段,与业务团队充分沟通,明确数据的完整性要求,避免因约束不合理导致的数据错误和业务逻辑混乱。
- 约束的维护与优化:随着业务的发展,数据库表结构和数据量可能会发生变化,此时需要对约束进行维护和优化。例如当数据量增大时,某些唯一约束可能会影响插入性能,可以考虑使用索引来优化。定期检查约束的有效性,尤其是外键约束,确保关联表之间的数据一致性。在 Java 全栈开发中,当数据库表结构发生变化时,相应的 Java 实体类和数据库操作代码也需要同步调整,以保证与数据库约束的一致性。
- 约束与数据安全:约束不仅保证数据的完整性,也与数据安全密切相关。例如非 NULL 约束可以防止关键数据缺失,避免因数据不完整导致的安全漏洞。在企业中,涉及用户敏感信息的表,如用户密码字段,通过默认约束设置强密码策略的默认值,能提高系统的安全性。同时,在进行数据库操作时,要确保代码遵循数据库的约束规则,防止非法数据的写入。
通过对 Oracle 数据库表的约束的学习,我们进一步提升了数据库设计和管理的能力。在后续的学习中,我们将继续探索 Oracle 数据库的更多高级特性,为成为优秀的 Java 全栈开发者积累更丰富的知识。
相关文章:
Oracle 数据库基础入门(二):深入理解表的约束
在 Oracle 数据库的学习进程中,表的约束是构建健壮、准确且高效数据库的关键要素。约束如同数据库的 “规则守护者”,它通过对数据的限制,确保了数据的完整性和一致性,就如同交通规则保障道路上车辆行驶的有序性一样。对于 Java 全…...

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

WebP2P技术在嵌入式设备中的应用:EasyRTC音视频通话SDK如何实现高效通信?
在数字化时代,实时通信技术(RTC)与人工智能(AI)的融合正在重塑各个行业的交互方式。从在线教育到远程医疗,从社交娱乐到企业协作,RTC的应用场景不断拓展。然而,传统的RTC解决方案往往…...
【零基础到精通Java合集】第三集:流程控制与数组
针对**“流程控制与数组”**的15分钟课程内容设计,聚焦代码逻辑设计与数据结构基础: 课程标题:流程控制与数组(15分钟) 目标:掌握分支/循环语法与数组操作,能编写条件判断与数据遍历程序 一、课程内容与时间分配 0-2分钟 课程目标与逻辑导图 明确学习目标:分支结构、…...

VsCode + EIDE + OpenOCD + STM32(野火DAP) 开发环境配置
VsCode EIDE OpenOCD STM32(野火DAP) 开发环境配置 接受了新时代编辑器的我,实在受不了Keil的上古编辑页面,周树人说过:由奢入俭难,下面我们一起折腾一下开源软件Vscode, 用以开发51和STM32,有错误之处&…...
【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系统拥有丰富的命令行工具,通过这些命令可以高效地完成各种系统管理和日常操作任务。以下是一些常见的Linux操作命令: 文件和目录操作: - 创建目录:使用 mkdir 命令,例如 mkdir test 可以创建名为 test 的目录。如…...

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

(十 九)趣学设计模式 之 中介者模式!
目录 一、 啥是中介者模式?二、 为什么要用中介者模式?三、 中介者模式的实现方式四、 中介者模式的优缺点五、 中介者模式的应用场景六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,…...
Leetcode 54: 螺旋矩阵
Leetcode 54: 螺旋矩阵 是一道经典的矩阵遍历模拟题目,要求我们以螺旋顺序遍历一个二维数组。这个问题在面试中非常经典,考察模拟、数组操作以及逻辑清晰度。掌握本题的高效解法可以迅速给面试官留下好印象。 适合面试的解法:边界法ÿ…...
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核心概念 机器人流程自动化(RPA)是一种通过软件机器人模拟人类操作,自动执行重复性、规则性任务的技术。RPA的核心在于其能够高效、准确地处理大量数据和流程,减少人工干预,从而提高工作…...
详解DeepSeek模型底层原理及和ChatGPT区别点
一、DeepSeek大模型原理 架构基础 DeepSeek基于Transformer架构,Transformer架构主要由编码器和解码器组成,在自然语言处理任务中,通常使用的是Transformer的解码器部分。它的核心是自注意力机制(Self - Attention),这个机制允许模型在处理输入序列时,关注序列中不同位…...
《2025年软件测试工程师面试》JAVA基础面试题
基础题 == 和 equals 的区别是什么? ==比较的是引用是否相同,比较的是对象的引用地址,如果比较的两个对象地址位不同,值相同也会返回falseequals()比较的是...

【算法学习之路】5.贪心算法
贪心算法 前言一.什么是贪心算法二.例题1.合并果子2.跳跳!3. 老鼠和奶酪 前言 我会将一些常用的算法以及对应的题单给写完,形成一套完整的算法体系,以及大量的各个难度的题目,目前算法也写了几篇,题单正在更新…...
如何打造一个安全稳定的海外社媒账号?
您好!随着TikTok、Instagram、Facebook等海外社媒平台的迅猛发展,越来越多的个人和企业希望借助这些平台实现全球化传播。然而,注册和运营海外社媒账号的过程中,许多人频繁遭遇到封禁、限制和账号关联等问题,常常导致严…...

【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 网络 和多线程类似,Qt 为了支持跨平台, 对网络编程的 API 也进行了重新封装。 实际 Qt 开发中进行网络编程,也不一定使用…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...

DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...