在 Oracle 数据库的学习进程中,表的约束是构建健壮、准确且高效数据库的关键要素。约束如同数据库的 “规则守护者”,它通过对数据的限制,确保了数据的完整性和一致性,就如同交通规则保障道路上车辆行驶的有序性一样。对于 Java 全栈开发者而言,熟练掌握 Oracle 数据库的约束知识,无论是在数据库设计、开发还是后续的维护中,都具有举足轻重的意义。接下来,让我们一同深入探索 Oracle 数据库中表的约束世界。
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。例如在学生信息表中,学生姓名这一列通常不能为空,因为一个没有姓名的学生记录是不完整且无意义的。
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
字段通常都直接提供自增约束。
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 并插入数据。
通过对 Oracle 数据库表的约束的学习,我们进一步提升了数据库设计和管理的能力。在后续的学习中,我们将继续探索 Oracle 数据库的更多高级特性,为成为优秀的 Java 全栈开发者积累更丰富的知识。