Oracle约束详解

一 约束的定义

约束是强加在表上的规则或条件。确保数据库满足业务规则。保证数据的完整性。当对表进行DML或DDL操作时,如果此操作会造成表中的数据违反约束条件或规则的话,系统就会拒绝执行这个操作。约束可以是列一级别的 也可以是表级别的。定义约束时没有给出约束的名字,ORACLE系统将为该约束自动生成一个名字,其格式为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);

SQL> select constraint_name,constraint_type,owner from user_constraints;

CONSTRAINT_NAME        C    OWNER

------------------------------ - ----------

NN_T1_ID                 C    SCOTT

方法二:

SQL> drop table t1 purge;

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

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

SQL> select constraint_name,table_name,owner from user_constraints;

CONSTRAINT_NAME          TABLE_NAME                   OWNER

------------------------------ ------------------------------ ----------

NN_T1_ID                 T1                             SCOTT

 

2 unique(唯一)

方法一:

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

方法二:

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

3  primary key(主键)

方法一:

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

方法二:

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

SQL> select constraint_name,table_name,owner from user_constraints;

CONSTRAINT_NAME          TABLE_NAME                   OWNER

------------------------------ ------------------------------ ----------

PK_T1_ID                    T1                           SCOTT

4  foreign key(外键)

方法一:

SQL> create table t2(id number,cc number,constraint fk_t2_id foreign key(id) references t1(id));

方法二:

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

SQL> select constraint_name,table_name,owner from user_constraints;

CONSTRAINT_NAME          TABLE_NAME                   OWNER

------------------------------ ------------------------------ ----------

PK_T1_ID                 T1                             SCOTT

PK_T2_ID                 T1                             SCOTT

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

关键字说明:

(1)  FOREING KEY:该选项用于指定在表级定义外部键约束。当在表级定义外部键约束时必须指定该选项,在列级定义外部键约束不需要指定该选项

(2)  REFERENCES:该选项用于指定主表名及其主键列。当定义外部键约束时,该选项必须指定。

(3)  ON DELETE CASCAED:该选项用于指定级联删除选项。如果在定义外部键约束时指定了该选项,那么当删除主表数据时会级联删除从表的相关数据。

(4)  ON DELECT SET NULL:该选项用于指定转换相关的外部键值为NULL,如果在定义外部键约束时指定了该选项,那么当删除主表数据时会将从表外部键列的数据设置为NULL。

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

SQL> create table t2(id number,sal number,constraint fk_t2_id foreign key(id) references t1(id));

SQL> delete t1; ----由于主外键约束,无法删除主表

delete t1

*

ERROR at line 1:

ORA-02292: integrity constraint (SYS.FK_T2_ID) violated - child record found

SQL> insert into t2 values(2,2); ---由于主外键的约束,无法在外键表插入主键中id列没有的值

insert into t2 values(2,2)

*

ERROR at line 1:

ORA-02291: integrity constraint (SYS.FK_T2_ID) violated - parent key not found

SQL> delete t2;

1 row deleted.

SQL> rollback;

SQL> drop table t2 purge;

SQL> create table t2(id number,sal number,constraint fk_t2_id foreign key(id) references t1(id) on delete cascade);  -----外键表添加级联删除参数

SQL> delete t1;   ----删除主键表上的数据,级联删除外键表上的数据

1 row deleted.

SQL> select * from t1;

no rows selected

SQL> select * from t2;

no rows selected

5  check(检查性约束)

方法一:

SQL> create table t3(id number,sal number,constraint ck_t3_sal check(sal between 5000 and 50000));

SQL> select constraint_name,table_name,owner from user_constraints;

CONSTRAINT_NAME          TABLE_NAME                   OWNER

------------------------------ ------------------------------                    ----------

CK_T3_SAL                T3                              SCOTT

方法二:

SQL> create table t3(id number,sal number);

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

 

六 维护约束

 

增加约束

(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;

修改约束名

在同一个方案中,约束名必须惟一,并且约束名也不能与其他对象同名。当用IMPDP工具或者IMP工具导入其他对象时,如发现有同名的对象,将会出错

语法:

ALTER TABLE table_name RENAME CONSTRAINT old_constraint_name

TO new_constraint_name;

例:

ALTER TABLE emp01 RENAME CONSTRAINT SYS_C005028

TO ck_emp01_salary;

SQL> alter table t1 rename constraint PK_T1_ID to new pk01_t1_id;

alter table t1 rename constraint PK_T1_ID to new pk01_t1_id

*

ERROR at line 1:  --------主键无法更改名字

ORA-23290: This operation may not be combined with any other operation

SQL> alter table t2 rename constraint fk_t2_id to fk01_t2_id;

SQL> select constraint_name,table_name from user_constraints where table_name=‘T2‘;

CONSTRAINT_NAME                TABLE_NAME

------------------------------ ------------------------------

FK01_T2_ID                     T2   -------------外键可以更改名字

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

SQL> select constraint_name,table_name from user_constraints where table_name=‘T1‘;

CONSTRAINT_NAME                TABLE_NAME

------------------------------ ------------------------------

PK_T1_ID                       T1

UN_T1_QQ                       T1

SQL> alter table t1 rename constraint un_t1_qq to un01_t1_qq;

SQL> select constraint_name,table_name from user_constraints where table_name=‘T1‘;

CONSTRAINT_NAME                TABLE_NAME

------------------------------ ------------------------------

PK_T1_ID                       T1

UN01_T1_QQ                     T1

禁止约束

禁止约束指使约束临时失效。当禁止了约束之后,约束规则将不再生效。在使用SQL*LOADER或INSERT装载数据之前,为了加快数据装载速度,应该首先禁止约束,然后装载数据。

语法:

ALTER TABLE table_name

DISABLE CONSTRAINT constaint_name [CASCAED];--CASCAED用于指定级联禁止从表的外部键

SQL> insert into t2 values(2,2);

insert into t2 values(2,2)

*

ERROR at line 1:

ORA-02291: integrity constraint (SYS.FK01_T2_ID) violated - parent key not

found

SQL> alter table t2 disable constraint fk01_t2_id;

Table altered.

SQL> insert into t2 values(2,2);

1 row created.

激活约束

语法:

ALTER TABLE table_name ENABLE CONSTRAINT constraint_name;

例:

SQL> alter table t2 enable constraint fk01_t2_id;

alter table t2 enable constraint fk01_t2_id

*

ERROR at line 1:   ---外键激活失败,原因是在外键表中含有主键表中没有的数据

ORA-02298: cannot validate (SYS.FK01_T2_ID) - parent keys not found

SQL> delete t2 where id=2;   -------删除数据

SQL> alter table t2 enable constraint fk01_t2_id;  ----激活成功

删除约束

当删除特定表的主键约束时,如果该表具有相关的从表,那么在删除主键约束时必须带有CASCAED选项

语法:

ALTER TABLE table_name DROP

CONSTRAINT constraint_name |PRIMARY KEY

例一:(删除唯一性约束)

SQL> select constraint_name,table_name from user_constraints where table_name=‘T1‘;

CONSTRAINT_NAME                TABLE_NAME

------------------------------ ------------------------------

PK_T1_ID                       T1

UN01_T1_QQ                     T1

SQL> alter table t1 drop constraint un01_t1_qq;

Table altered.

SQL> select constraint_name,table_name from user_constraints where table_name=‘T1‘;

CONSTRAINT_NAME                TABLE_NAME

------------------------------ ------------------------------

PK_T1_ID                       T1

例二:(删除主键约束,级联删除外键约束)

SQL> alter table t1 drop primary key cascade;

Table altered.

SQL> select constraint_name,table_name from user_constraints where table_name=‘T2‘;

no rows selected

SQL> select constraint_name,table_name from user_constraints where table_name=‘T1‘;

no rows selected

显示信息

1.USER_CONSTRAINTS

2.USER_CONS_COLUMNS

SQL> select constraint_name,table_name,column_name from user_cons_columns where table_name=‘T1‘;

CONSTRAINT_NAME             TABLE_NAME                     COLUM

------------------------------       ------------------------------                   -----

UN_T1_ID                          T1                           ID

时间: 2024-12-06 10:16:01

Oracle约束详解的相关文章

问题:Oracle出发器;结果:1、Oracle触发器详解,2、Oracle触发器示例

ORACLE触发器详解 本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触发器触发次序 8.2.2 创建DML触发器 8.2.3 创建替代(INSTEAD OF)触发器 8.2.3 创建系统事件触发器 8.2.4 系统触发器事件属性 8.2.5 使用触发器谓词 8.2.6 重新编译触发器 8.3 删除和使能触发器 8.4 触发器和数据字典 8.5   数据库触发器的应用举例 触发器是许多关系数据库系

ORACLE SEQUENCE 详解

1.    About Sequences(关于序列) 序列是数据库对象一种.多个用户可以通过序列生成连续的数字以此来实现主键字段的自动.唯一增长,并且一个序列可为多列.多表同时使用. 序列消除了串行化并且提高了应用程序一致性.(想象一下没有序列的日子怎么办?) 2.   Creating Sequences(创建序列) 前提:Prerequisites To create a sequence inyour own schema, you must have the CREATE SEQUEN

oracle 序列 详解

序列: 是oacle提供的用于产生一系列唯一数字的数据库对象. l  自动提供唯一的数值 l  共享对象 l  主要用于提供主键值 l  将序列值装入内存可以提高访问效率 创建序列: 1.  要有创建序列的权限 create sequence 或 create any sequence 2.  创建序列的语法 CREATE SEQUENCE sequence  //创建序列名称        [INCREMENT BY n]  //递增的序列值是n 如果n是正数就递增,如果是负数就递减 默认是1

Oracle SGA详解

SGA(SYSTEM Global Area )系统全局区 l 数据高速缓存 在Oracle进行数据处理的过程中,代价最昂贵的就是物理 I/O操作了.同样的数据从内存中得到要比从磁盘上读取快的多.因此,优化Oracle的一个重要的目标就是尽可能的降低物理 I/O操作. Oracle的 Buffer Cache用于缓存从磁盘中读取的数据,当 Oracle需要查找某些信息的时候,首先会在 BufferCache中寻找,如果找到了,则直接将结果返回.如果找不到,则需要对磁盘进行扫描, Oracle将在

Oracle ROWID详解

1.ROWID定义 ROWID:数据库中行的全局唯一地址 对于数据中的每一行,rowid伪列返回行的地址.rowid值主要包含以下信息: 对象的数据对象编号 该行所在的数据文件中的数据块 该行中数据块的位置(第一行是0) 数据行所在的数据文件(第一个文件是1).该文件编号是相对于表空间. 通常来说,一个rowid值唯一标识数据中的一行.然而,存储在同一聚簇中不同的表可以有相同的rowid. 2.扩展ROWID 从Oracle 8i开始使用扩展rowid标识行物理地址 扩展rowid使用base6

JAVA通过JDBC连接Oracle数据库详解【转载】

JAVA通过JDBC连接Oracle数据库详解 (2011-03-15 00:10:03) 转载▼http://blog.sina.com.cn/s/blog_61da86dd0100q27w.html Java连接Oracle步骤: 1.注册加载驱动 驱动名:DRIVER="oracle.jdbc.driver.OracleDriver"; Class.forName("驱动类名"); 2.获得连接 数据库地址: URL="jdbc:oracle:thi

【转载】oracle 分区表详解

一.分区表的概述:     Oracle的表分区功能通过改善可管理性.性能和可用性,从而为各式应用程序带来了极大的好处.通常,分区可以使某些查询以及维护操作的性能大大提高.此外,分区还可以极大简化常见的管理任务,分区是构建千兆字节数据系统或超高可用性系统的关键工具.     分区功能能够将表.索引或索引组织表进一步细分为段,这些数据库对象的段叫做分区.每个分区有自己的名称,还可以选择自己的存储特性.从数据库管理员的角度来看,一个分区后的对象具有多个段,这些段既可进行集体管理,也可单独管理,这就使

Oracle序列号详解

例1:创建序列: CREATE SEQUENCE ABC INCREMENT BY 1 START WITH 1 MAXVALUE 9999999999 NOCYCLE NOCACHE; 语法详解 CREATE SEQUENCE 序列名 [INCREMENT BY n] --1. [START WITH n] --2. [{MAXVALUE/MINVALUE n|NOMAXVALUE}] --3. [{CYCLE|NOCYCLE}] --4. [{CACHE n|NOCACHE}]; --5.

【Oracle】详解Oracle中的序列

序列: 是oacle提供的用于产生一系列唯一数字的数据库对象. 自动提供唯一的数值 共享对象 主要用于提供主键值 将序列值装入内存可以提高访问效率 创建序列: 1.  要有创建序列的权限 create sequence 或 create any sequence 2.  创建序列的语法 CREATE SEQUENCE sequence  //创建序列名        [INCREMENT BY n]  //递增的序列值是n 如果n是正数就递增,如果是负数就递减 默认是1        [STAR