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

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

一、主键约束

(一)作用

  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 全栈开发者积累更丰富的知识。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/978708.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Xlua 编译 Windows、UWP、Android、iOS 平台支持库

Xlua 编译 Windows、UWP、Android、iOS 平台支持库 Windows&#xff1a; 安装 Visual Studio&#xff08;推荐 2017 或更高版本&#xff09; 安装 CMake&#xff08;https://cmake.org/&#xff09; macOS&#xff1a; 安装 Xcode 和命令行工具 安装 CMake 检查 cmake 是否安…

npm : 无法加载文件 E:\ProgramFiles\Nodejs\npm.ps1,因为在此系统上禁止运行脚本。

这个错误是因为 Windows 系统的 PowerShell 执行策略 限制了脚本的运行。默认情况下&#xff0c;PowerShell 的执行策略是 Restricted&#xff0c;即禁止运行任何脚本。以下是解决该问题的步骤&#xff1a; 1. 检查当前执行策略 打开 PowerShell&#xff08;管理员权限&#x…

基于专利合作地址匹配的数据构建区域协同矩阵

文章目录 地区地址提取完成的处理代码 在专利合作申请表中&#xff0c;有多家公司合作申请。在专利权人地址中&#xff0c; 有多个公司的地址信息。故想利用这里多个地址。想用这里的地址来代表区域之间的专利合作情况代表区域之间的协同、协作情况。 下图是专利合作表的一部分…

若依vue plus环境搭建

继前面文章若依系统环境搭建记录-CSDN博客 把ruoyi vue plus也摸索了下。 作者是疯狂的狮子&#xff0c;dromara/RuoYi-Vue-Plus 初始化文档&#xff1a;项目初始化&#xff0c;环境搭建的视频&#xff1a;RuoYi-Vue-Plus 5.0 搭建与运行_哔哩哔哩_bilibili 上来就列出了一…

在ubuntu如何安装samba软件?

我们在开发过程中&#xff0c;经常修改代码&#xff0c;可以安装samba文件来实现&#xff0c;把ubuntu的存储空间指定为我们win上的一个磁盘&#xff0c;然后我们在或者磁盘里面创建.c文件&#xff0c;进行代码修改和编写。samba能将linux的文件目录直接映射到windows&#xff…

论文阅读笔记:Deep Face Recognition: A Survey

论文阅读笔记&#xff1a;Deep Face Recognition: A Survey 1 介绍2 总览2.1 人脸识别组件2.1.1 人脸处理2.1.2 深度特征提取2.1.3 基于深度特征的人脸对比 3 网络结构和损失函数3.1 判别损失函数的演化3.1.1 基于欧式距离的损失3.1.2 基于角度/余弦边距的损失3.1.3 Softmax损失…

使用 Polars 进行人工智能医疗数据分析(ICU数据基本测试篇)

引言 在医疗领域&#xff0c;数据就是生命的密码&#xff0c;每一个数据点都可能蕴含着拯救生命的关键信息。特别是在 ICU 这样的重症监护场景中&#xff0c;医生需要实时、准确地了解患者的病情变化&#xff0c;以便做出及时有效的治疗决策。而随着医疗技术的飞速发展&#x…

Fiddler在Windows下抓包Https

文章目录 1.Fiddler Classic 配置2.配置浏览器代理自动代理手动配置浏览器代理 3.抓取移动端 HTTPS 流量&#xff08;可选&#xff09;解决抓取 HTTPS 失败问题1.Fiddler证书过期了 默认情况下&#xff0c;Fiddler 无法直接解密 HTTPS 流量。需要开启 HTTPS 解密&#xff1a; 1…

Anaconda安装 超详细版 (2025版)

目录 第一步&#xff1a;下载anaconda安装包 官网下载&#xff1a;Anaconda | Built to Advance Open Source AI 清华大学镜像站下载&#xff08;速度较快&#xff09; 第二步&#xff1a;安装anaconda 第三步&#xff1a;验证安装 扩展 创建conda基本环境 激活conda环…

想知道两轮差速方形底盘 URDF 咋做,ROS2 配 Rviz 咋显示吗?看这里!

视频讲解 想知道两轮差速方形底盘 URDF 咋做&#xff0c;ROS2 配 Rviz 咋显示吗&#xff1f;看这里&#xff01; 模型概述 一个方形底盘和两个差速驱动轮 URDF 代码 <?xml version"1.0" encoding"utf-8"?> <robot name"diff"> …

轻量化网络设计|ShuffleNet:深度学习中的轻量化革命

一、引言 在深度学习中&#xff0c;卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;CNN&#xff09;无疑是大家最耳熟能详的算法之一。自诞生以来&#xff0c;CNN 在图像分类、目标检测、语义分割等众多计算机视觉任务中取得了令人瞩目的成就&#xff0c;…

最好Wordpree+Apache+PHP安装教程

前提需要 PHP的安装最少需要7.4以上Mysql的安装&#xff0c;直接默认最新版就行APache服务器&#xff08;HTTP服务器&#xff0c;只有用这个你的软件才能在服务器上运行&#xff09; 安装apache 安装 sudo apt install apache2查看防火墙 sudo ufw app list如果有 Apache那…

Linux实操——在服务器上直接从百度网盘下载(/上传)文件

Linux Linux实操——在服务器上直接从百度网盘下载&#xff08;/上传&#xff09;文件 文章目录 Linux前言一、下载并安装bypy工具二、认证并授权网盘账号三、将所需文件转移至目的文件夹下四、下载文件五、上传文件六、更换绑定的百度云盘账户 前言 最近收到一批很大的数据&…

一周一个Unity小游戏2D反弹球游戏 - 移动的弹板(触屏版)

前言 上文中实现了用鼠标移动控制弹板的移动&#xff0c;本文将实现手指触屏时弹板跟随手指移动的功能&#xff0c;并通过使用Unity自带的Device Simulator Devices Package来验证和模拟触屏设备的使用场景。 安装Device Simulator Devices Package 打开Unity Package Manager&…

DeepSeek 开源狂欢周(一)FlashMLA:高效推理加速新时代

上周末&#xff0c;DeepSeek在X平台&#xff08;Twitter&#xff09;宣布将开启连续一周的开源&#xff0c;整个开源社区为之沸腾&#xff0c;全球AI爱好者纷纷为关注。没错&#xff0c;这是一场由DeepSeek引领的开源盛宴&#xff0c;推翻了传统推理加速的种种限制。这周一&…

分类预测 | Matlab实现GWO-LSSVM灰狼算法优化最小二乘支持向量机多特征分类预测

分类预测 | Matlab实现GWO-LSSVM灰狼算法优化最小二乘支持向量机多特征分类预测 目录 分类预测 | Matlab实现GWO-LSSVM灰狼算法优化最小二乘支持向量机多特征分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现GWO-LSSVM灰狼算法优化最小二乘支持向量机…

【Java项目】基于Spring Boot的校园闲置物品交易网站

【Java项目】基于Spring Boot的校园闲置物品交易网站 技术简介&#xff1a;采用Java技术、Spring Boot框架、MySQL数据库等实现。 系统简介&#xff1a;校园闲置物品交易网站是一个典型的管理系统&#xff0c;主要功能包括管理员&#xff1a;首页、个人中心、用户管理、商品类…

Ray生产集群配置

Ray 作为一个新兴的高性能分布式计算框架 Ray 的配置方法:包括集群资源、日志与调试、端口配置、TLS 认证以及 Java 应用程序的配置等 Ray 的配置技巧,如何提升分布式计算的效率和可靠性。 一、Ray 集群资源配置 (一)资源自动检测 Ray 在启动时默认会自动检测可用的资源…

cpp每日温度(单调栈)

题目如下 输入n和n个温度值&#xff0c;输出所找到对应温度后面比其更大的温度值 代码及解析如下&#xff1a; 谢谢观看&#xff01;&#xff01;&#xff01;

校园快递助手小程序毕业系统设计

系统功能介绍 管理员端 1&#xff09;登录&#xff1a;输入账号密码进行登录 2&#xff09;用户管理&#xff1a;查看编辑添加删除 学生信息 3&#xff09;寄件包裹管理&#xff1a;查看所有的包裹信息&#xff0c;及物流信息 4&#xff09;待取件信息&#xff1a;查看已到达的…