千家信息网

Oracle 约束详解

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,一 约束的定义约束是强加在表上的规则或条件。确保数据库满足业务规则。保证数据的完整性。当对表进行DML或DDL操作时,如果此操作会造成表中的数据违反约束条件或规则的话,系统就会拒绝执行这个操作。约束可
千家信息网最后更新 2026年11月01日Oracle 约束详解

一 约束的定义

约束是强加在表上的规则或条件。确保数据库满足业务规则。保证数据的完整性。当对表进行DML或DDL操作时,如果此操作会造成表中的数据违反约束条件或规则的话,系统就会拒绝执行这个操作。约束可以是列一级别的 也可以是表级别的。定义约束时没有给出约束的名字,ORACE系统将为该约束自动生成一个名字,其格式为SYS_Cn,其中n为自然数(强烈建议各位在创建表或增加约束时,给约束定义名称。)
在Oracle中,数据完整性可以使用约束、触发器、应用程序(过程、函数)三种方法来实现,在这三种方法中,因为约束易于维护,并且具有最好的性能,所以作为维护数据完整性的首选。
列级约束:
列级定义是在定义列的同时定义约束;
column [CONSTRAINT constraint_name] constraint_type
表级约束:
表级定义是指在定义了所有列后,再定义约束,这里需要注意,not null约束只能在列级上定义;
column ,...,
[CONSTRAINT constraint_name] constraint_type (column,...)

二 约束功能

约束的功能:实现一些业务规则,防止无效的垃圾数据进入数据库,维护数据库的完整性(完整性指正确性与一致性)。从而使数据库的开发和维护都更加容易。

三 约束的分类

1 not null(非空)
如果在列上定义了not null,那么当插入数据时,必须为列提供,数据不能为NULL。约束只能在列级定义,不能在表级定义。

2 unique(唯一)
当定义了唯一约束后,该列值是不能重复的,但是可以为null。
3 primary key(主键)
用于唯一的标识表行的数据,当定义主键约束后,该列不但不能重复而且不能为NULL。一张表最多只能有一个主键,但是可以由多个unique约束。
创建主键或唯一约束后,ORACLE会自动创建一个与约束同名的索引(UNIQUENES为UNIQUE唯一索引)。需要注意的是:每个表只能有且有一个主键约束。
4 foreign key(外键)
用于定义主表和从表之间的关系,外键约束要定义在从表上,主要则必须具有主键约束或是unique约束,当定义外键约束后,要求外键列数据必须在主表的主键列存在或是为NULL。
用来维护从表(Child Table)和主表(Parent Table)之间的引用完整性. 外键约束是个有争议性的约束,它一方面能够维护数据库的数据一致性,数据的完整性。防止错误的垃圾数据入库; 另外一方面它会增加表插入、更新等SQL性能的额外开销,不少系统里面通过业务逻辑控制来取消外键约束。例如在数据仓库中,就推荐禁用外键约束。
5 check
用于强制行数据必须满足的条件,假定在sal列上定义了check约束,并要求sal列值在1000~2000之间,如果不在1000~2000之间就会提示出错。

四 约束命令规范

约束名称建议自己定义一套命名规则,否则使用系统生成的约束名,很难能把它和对应的表、字段联系起来。
    非空约束     NN_表名_列名
    唯一约束     UK_表名_列名
    主键约束     PK_表名
    外键约束     FK_表名_列名
    条件约束     CK_表名_列名
    默认约束     DF_表名_列名
如果约束名称超过32位长度,建议应该缩写表名,而不应用NN_表名_数字。不过具体视情况而定,很多时候 DF_表名_列名 这样命名,往往超出了32字符。所以有时候需要缩写表面或是采用其它规则。

五 创建约束
1 not null(非空)
创建
SQL> create table t1(id number,name varchar2(20) constraint nn_t1_id not null);

Table created.
SQL> col CONSTRAINT_NAME format A50
SQL> col OWNER format A20
SQL> select constraint_name,constraint_type,owner from user_constraints;

CONSTRAINT_NAME C OWNER


SYS_C009047 V SCOTT
FK_DEPTNO R SCOTT
SYS_C009046 C SCOTT
NN_T1_ID C SCOTT
PK_DEPT P SCOTT
PK_EMP P SCOTT

6 rows selected.
修改
SQL> drop table t1 purge;

Table dropped.

SQL> create table t1(id number,name varchar2(20));

Table created.

SQL> alter table t1 modify id constraint nn_t1_id not null;

Table altered.

SQL> select constraint_name,constraint_type,owner from user_constraints;

CONSTRAINT_NAME C OWNER


FK_DEPTNO R SCOTT
SYS_C009046 C SCOTT
NN_T1_ID C SCOTT
PK_DEPT P SCOTT
PK_EMP P SCOTT
SYS_C009047 V SCOTT
2 unique(唯一)
创建
SQL> drop table t1 purge;

Table dropped.

SQL> create table t1(id number,qq number,constraint un_t1_qq unique(qq));

Table created.
修改
SQL> drop table t1 purge;

Table dropped.

SQL> create table t1(id number,qq number);

Table created.
SQL> alter table t1 add constraint un_t1_qq unique(qq);

Table altered.
3 primary key(主键)
创建
SQL> drop table t1 purge;

Table dropped.

SQL> create table t1(id number,qq number,constraint pk_t1_id primary key(id));

Table created.
修改
SQL> drop table t1 purge;

Table dropped.
SQL> create table t1(id number,qq number);

Table created.

SQL> alter table t1 add constraint pk_t1_id primary key(id);

Table altered.
4 foreign key(外键)
创建
SQL> create table t2(id number,cc number,constraint fk_t2_id foreign key(id) references t1(id));

Table created.
修改
SQL> drop table t2 purge
2 ;

Table dropped.

SQL> create table t2(id number,cc number);

Table created.

SQL> alter table t2 add constraint pk_t2_id foreign key(id) references t1(id);

Table altered.
当定义了外部键约束之后,要求外部键列的数据必须在主表的主键列(或惟一列)中存在,或者为NULL,FOREING KEY约束既可以在列级定义,也可以在表级定义。

关键字说明:
(1) FOREING KEY:该选项用于指定在表级定义外部键约束。当在表级定义外部键约束时必须指定该选项,在列级定义外部键约束不需要指定该选项
(2) REFERENCES:该选项用于指定主表名及其主键列。当定义外部键约束时,该选项必须指定.。
(3) ON DELETE CASCAED:该选项用于指定级联删除选项。如果在定义外部键约束时指定了该选项,那么当删除主表数据时会级联删除从表的相关数据。
(4) ON DELECT SET NULL:该选项用于指定转换相关的外部键值为NULL,如果在定义外部键约束时指定了该选项,那么当删除主表数据时会将从表外部键列的数据设置为NULL。
5 check(检查性约束)
创建
SQL> create table t3(id number,sal number,constraint ck_t3_sal check(sal between 5000 and 50000));

Table created.
修改
SQL> drop table t3 purge;

Table dropped.

SQL> create table t3(id number,sal number);
六 维护约束

1 增加约束
(1) 如果增加UNIQUE、PRIMARY KEY、FOREIGN KEY 和CKECK 必须使用ALTER TABLE语句的ADD子句;
(2) 如果增加NOT NULL约束,那么必须使用ALTER TABLE语句的MODIFY子句,如:
ALTER TABLE table_name ADD [CONSTRAINT constraint_name]
constraint_type (column,...)
ALTER TABLE table_name MODIFY column
[CONSTRAINT constraint_name] NOT NULL;

2 修改约束名
在同一个方案中,约束名必须惟一,并且约束名也不能与其他对象同名。当用IMPDP工具或者IMP工具导入其他对象时,如发现有同名的对象,将会出错
语法:
ALTER TABLE table_name RENAME CONSTRAINT old_constraint_name
TO new_constraint_name;
SQL> ALTER TABLE T1 rename constraint pk_t1_id to pk_t1_idnew
2 ;

Table altered.

3 禁止约束

禁止约束指使约束临时失效。当禁止了约束之后,约束规则将不再生效。在使用SQL*LOADER或INSERT装载数据之前,为了加快数据装载速度,应该首先禁止约束,然后装载数据。
语法:
ALTER TABLE table_name
DISABLE CONSTRAINT constaint_name [CASCAED];--CASCAED用于指定级联禁止从表的外部键
SQL> ALTER TABLE T2 DISABLE constraint pk_t2_id;

Table altered.
4 激活约束

语法:
ALTER TABLE table_name ENABLE CONSTRAINT constraint_name;
SQL> ALTER TABLE T2 enABLE constraint pk_t2_id;

Table altered.
5 删除约束

当删除特定表的主键约束时,如果该表具有相关的从表,那么在删除主键约束时必须带有CASCAED选项
语法:
ALTER TABLE table_name DROP
CONSTRAINT constraint_name |PRIMARY KEY
SQL> ALTER TABLE T3 drop constraint ck_t3_sal;

Table altered.
6 显示信息

1.USER_CONSTRAINTS
2.USER_CONS_COLUMNS
3.SQL> set line 100
SQL> col CONSTRAINT_NAME format A20
SQL> col table_NAME format A20
SQL> col column_NAME format A20
SQL> select constraint_name,table_name,column_name from user_cons_columns where table_name='T1';

CONSTRAINT_NAME TABLE_NAME COLUMN_NAME


PK_T1_ID T1 ID

Table created.

SQL> alter table t3 add constraint ck_t3_sal check(sal>5000);

Table altered.

数据 完整性 规则 数据库 之间 条件 系统 语法 业务 名称 对象 建议 装载 一致 一方 一致性 功能 名字 垃圾 子句 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广东猪兼强互联网科技有限公司 上海卓越科技互联网 互联网和科技创新 朗新科技与工业互联网 高科技与互联网 互联网金融科技平台 睿民互联网科技 广西互联网科技公司 亿人帮互联网科技 卓越科技互联网 招聘 互联网公司会议桌创意科技软装饰 互联网企业和科技型企业 来此购互联网科技有限公司 互联网软件和科技 和信科技工业互联网 互联网时代的科技公司 电子商务与互联网科技的关系 互联网营销推广黑科技 江苏互联网智能科技软件 东风日产互联网科技公司叫什么 互联网科技工作委员会主任 苏州找大状互联网科技有限公司 科技和互联网公司 顺网科技2021年互联网排名 山东吉时兔互联网科技有限公司 广州优美互联网科技 互联网之后的科技是什么 武汉健翔互联网络科技有限公司 西安小鹰速贷互联网科技有限公司 互联网科技包装股
0