约束简单介绍

约束用于确保数据库数据满足特定的商业逻辑或者企业规则,假设定义了约束,而且数据不符

合约束,那么DML操作(INSERT、UPDATE、DELETE)将不能成功运行。约束包含NOT NULL、UNIQUE、PRIMARY KEY、FOREING KEY 以及CHECK等五种类型

定义约束

列级约束:


column [CONSTRAINT constraint_name] constraint_type

表级约束:

column ,...,

[CONSTRAINT constraint_name] constraint_type (column,...)

1.定义NOT NULL约束

NOT NULL 约束仅仅能在列级定义,不能在表级定义

例:

CREATE TABLE emp01(

eno INT  NOT NULL,

name VARCHAR2(10) CONSTRAINT nn_name2 NOT NULL,

salary NUMBER(6,2)

);

上例中,eno列与name列上定义了NOT NULL约束,当中eno列的NOT NULL约束没有指定约束名,而

name列则指定了约束名nn_name。

能够通过查询user_constraints字典来查看所定义的约束,如:

SQL> select constraint_name,constraint_type from user_constraints

2  where table_name='EMP01';

CONSTRAINT_NAME                                              CO

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

SYS_C0010618                                                 C

NN_NAME                                                      C

可见,没有给约束名的,系统将会自己主动的定义一个约束名称,当中约束类型中,P:表示主键,R:

表示外键,C表示NOT NULL或CHECK,U表示UNIQUE。且系统中同一方案下的的约束名不能反复

2.定义UNIQUE约束

定义了惟一约束之后,惟一约束列的列值不能反复,但能够为NULL。UNIQUE约束既能够在列级

定义,也能够在表级定义

例:

CREATE TABLE emp02(

eno INT UNIQUE,name VARCHAR2(10) CONSTRAINT u_name UNIQUE,

salary NUMBER(6,2)

);

相同,假设没有给出约束名,系统会自己主动定义一个名称,可从查询结果得出

SQL> select constraint_name,constraint_type from user_constraints

2  where table_name='EMP02';

CONSTRAINT_NAME                                              CO

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

SYS_C0010623                                                 U

U_NAME

U

3.定义PRIMARY KEY 约束

当定义主键约束后,主键约束列的列值不仅不能反复,并且也不能为NULL。主键约束既能够在

列级定义,也能够在表级定义。一张表最多仅仅能具有一个主键约束,当一个表中的多个列都要为

主键是,能够在表级定义。

例1:列级定义主键

CREATE TABLE depto04(

dno INT PRIMARY KEY,

dname VARCHAR2(10),loc VARCHAR2(20)

);

通过查询user_constraints可得出

SQL>  select constraint_name ,constraint_type from user_constraints

2  where table_name='DEPT04';

CONSTRAINT_NAME                                              CO

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

SYS_C0010625                                                 P

通过查询user_cons_columns可得出

SQL> select constraint_name,column_name from user_cons_columns

2  where table_name='DEPT04';

CONSTRAINT_NAME                                              COLUMN_NAME

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

SYS_C0010625                                                 DNO

例2:表级定义主键

CREATE TABLE dept05(

dno INT,

dname VARCHAR2(10),loc VARCHAR2(20),

PRIMARY KEY(dno,dname)

);

通过查询user_constraints能够得出

SQL> select constraint_name,constraint_type from user_constraints

2  where table_name='DEPT05';

CONSTRAINT_NAME                                              CO

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

SYS_C0010626                                                 P

通过查询user_cons_columns可得出

SQL> select constraint_name,column_name from user_cons_columns

2  where table_name='DEPT05';

CONSTRAINT_NAME                                              COLUMN_NAME

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

SYS_C0010626                                                 DNO

SYS_C0010626                                                 DNAME

可见,当在表级定义时,约束名称将会同样,而在user_cons_columns查询是,每一列将相应约束

名称同样的两条记录

4.定义FOREING KEY约束

当定义了外部键约束之后,要求外部键列的数据必须在主表的主键列(或惟一列)中存在,或

者为NULL,FOREING KEY约束既能够在列级定义,也能够在表级定义。

keyword说明:

FOREING KEY:该选项用于指定在表级定义外部键约束。当在表级定义外部键约束时必须指定该选

项,在列级定义外部键约束不须要指定该选项

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

ON DELETE CASCAED:该选项用于指定级联删除选项。假设在定义外部键约束时指定了该选项,那

么当删除主表数据时会级联删除从表的相关数据。

ON DELECT SET NULL:该选项用于指定转换相关的外部键值为NULL,假设在定义外部键约束时指定

了该选项,那么当删除主表数据时会将从表外部键列的数据设置为NULL。

例1:列级定义外键约束

CREATE TABLE emp04(

eno INT,name VARCHAR2(10),salary NUMBER(6,2),

dno INT CONSTRAINT fk_dno REFERENCES dept04(dno)

);

SQL> select constraint_name,constraint_type from user_constraints

2  where table_name='EMP04';

CONSTRAINT_NAME                                              CO

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

FK_DNO                                                       R

SQL> select constraint_name,column_name from user_cons_columns

2  where table_name='EMP04';

CONSTRAINT_NAME                                              COLUMN_NAME

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

FK_DNO                                                       DNO

例2:表级定义外键约束

CREATE TABLE emp05(

eno INT,name VARCHAR2(10),salary NUMBER(6,2),

dno INT,

CONSTRAINT fk_dno_name FOREIGN KEY(dno,name) REFERENCES dept05(dno,dname)

);

SQL> select constraint_name,constraint_type from user_constraints

2  where table_name='EMP05'

3  ;

CONSTRAINT_NAME                                              CO

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

FK_DNO_NAME                                                  R

SQL> select constraint_name,column_name from user_cons_columns

2  where table_name='EMP05';

CONSTRAINT_NAME                                              COLUMN_NAME

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

FK_DNO_NAME                                                  DNO

FK_DNO_NAME                                                  NAME

5.定义CHECK约束

CHECK约束既能够在列级定义,也能够在表级定义。CHECK约束同意列为NULL。

例:

CREATE TABLE emp06(

eno INT,name VARCHAR2(10),salary NUMBER(6,2),

CHECK (salary BETWEEN 1000 AND 5000)

);

SQL>  select constraint_name,constraint_type from user_constraints

2   where table_name='EMP06';

CONSTRAINT_NAME                                              CO

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

SYS_C0010629                                                 C

SQL> select constraint_name,column_name from user_cons_columns

2  where table_name='EMP06';

CONSTRAINT_NAME                                              COLUMN_NAME

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

SYS_C0010629                                                 SALARY

6.定义复合约束

复合约束即在表级定义,基于多列的复合约束,如:

CREATE TABLE dept05(

dno INT,

dname VARCHAR2(10),loc VARCHAR2(20),

PRIMARY KEY(dno,dname)

);或

CREATE TABLE emp05(

eno INT,name VARCHAR2(10),salary NUMBER(6,2),

dno INT,

CONSTRAINT fk_dno_name FOREIGN KEY(dno,name) REFERENCES dept05(dno,dname)

);

9.3维护约束

9.3.1添加约束


假设添加UNIQUE、PRIMARY KEY、FOREIGN KEY 和CKECK 必须使用ALTER TABLE语句的ADD子句;

假设添加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;

9.3.2改动约束名

在同一个方案中,约束名必须惟一,而且约束名也不能与其它对象同名。当鱫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;

9.3.3 删除约束

当删除特定表的主键约束时,假设该表具有相关的从表,那么在删除主键约束

时必须带有CASCAED选项

语法:

ALTER TABLE table_name DROP

CONSTRAINT constraint_name |PRIMARY KEY

例1

ALTER TABLE emp01 DROP CONSTRAINT ck_emp01_salary;

例2

ALTER TABLE dept01 DROP PRIMARY KEY CASCAED

9.3.4禁止约束

禁止约束指使约束暂时失效。当禁止了约束之后,约束规则将不再生效。在使用SQL*LOADER或

INSERT装载数据之前,为了加快数据装载速度,应该首先禁止约束,然后装载数据。

语法:

ALTER TABLE table_name

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

约束

例:

ALTER TABLE emp05 DISABLE CONSTAINT SYS_C00502;

9.3.5 激活约束

语法:

ALTER TABLE table_name ENABLE CONSTRAINT constraint_name;

例:

ALTER TABLE emp05 ENABLE CONSTRAINT SYS_C005022;

9.4 显示约束信息

1.USER_CONSTRAINTS

2.USER_CONS_COLUMNS

Zz_cnblogs :http://www.cnblogs.com/ljcbest/archive/2010/09/02/1816346.html

oracle Constraint[相似 constraint使用方法总结 I]的更多相关文章

  1. Oracle创建自增字段方法-ORACLE SEQUENCE的简单介绍

    引用自 :http://www.2cto.com/database/201307/224836.html   Oracle创建自增字段方法-ORACLE SEQUENCE的简单介绍 先假设有这么一个表 ...

  2. oracle调用JAVA类的方法

    导入jar包 在oracle中导入需要的jar包,我们把编辑好的java类打成jar包,直接在oarcle里面写简单的调用就可以了,  1.操作系统需要拥有支持loadjava命令的jdk.  2.加 ...

  3. 【转】有关Oracle随机字符串的生成方法及具体应用

    Oracle生成随机字符串的方法是通过dbms_random.string实现的. 1.dbms_random.string用法Oracle官方文档参考链接:http://download.oracl ...

  4. oracle 快速删除大批量数据方法(全部删除,条件删除,删除大量重复记录)

    oracle 快速删除大批量数据方法(全部删除,条件删除,删除大量重复记录) 分类: ORACLE 数据库 2011-05-24 16:39 8427人阅读 评论(2) 收藏 举报 oracledel ...

  5. Oracle OCI-22053:溢出错误解决方法

    原文 Oracle OCI-22053:溢出错误解决方法 Oracle 数值数据类型最多可存储 38 个字节的精度.当将 Oracle 数值转换为公共语言运行库数据类型时,小数点后边的位数可能过多,这 ...

  6. Oracle除去换行符的方法

    Oracle除去换行符的方法   很多数据存进数据库后,可能需要将整条数据取出,并用特殊 符号分割,而且整条数据必须是处于一行,如此,如果数据出现 换行的情况,那么读取时就有问题.     这个时候就 ...

  7. oracle误删除数据的恢复方法

    学习数据库时,我们只是以学习的态度,考虑如何使用数据库命令语句,并未想过工作中,如果误操作一下,都可能导致无可挽回的损失.当我在工作中真正遇到这些问题时,我开始寻找答案. 今天主要以oracle数据库 ...

  8. 经历:asp.net oracle 部署问题以及解决方法

    原文:[原创]经历:asp.net oracle 部署问题以及解决方法 精简的美丽...... 一.环境    开发环境        win7 64bit         Vs2010       ...

  9. Oracle删除死锁进程的方法

    本文实例讲述了Oracle删除死锁进程的方法.分享给大家供大家参考.具体如下: 步骤1:用以下SQL查看进程列表,判断出被锁定的表 复制代码代码如下: SELECT dob.OBJECT_NAME T ...

  10. 恢复oracle数据库误删除数据的方法汇总

    学习数据库时,我们只是以学习的态度,考虑如何使用数据库命令语句,并未想过工作中,如果误操作一下,都可能导致无可挽回的损失.当我在工作中真正遇到这些问题时,我开始寻找答案.今天主要以oracle数据库为 ...

随机推荐

  1. HGE引擎 - 绘制,声音,碰撞处理

    原帖地址:http://blog.csdn.net/i_dovelemon/article/details/8818037 另外,年代久远,该引擎官网早已上不去了!!! 1.库的安装和下载 从官网上h ...

  2. wamp在win7下64位系统memcache/memcached安装教程

    折腾了1个多小时,终于搞定.操作系统时64位的,php5.3.13 类似于上一篇的xdebug安装教程~~ memcache和memcached的区别  在自己的新程序中打算全面应用memcached ...

  3. 采用keepalived施工可用性MySQL-HA

    描述了使用keepalived施工可用性MySQL-HA,两个保证MySQL数据一致性,然后,keepalived虚拟IP,经keepalived内置的在线监测功能来实现MySQL. AD: 关于My ...

  4. PL/SQL“ ORA-14551: 无法在查询中执行 DML 操作”解决

    环境 Oracle 11.2.0 + SQL Plus 问题 根据以下要求编写函数:将scott.emp表中工资低于平均工资的职工工资加上200,并返回修改了工资的总人数.PL/SQL中有更新的操作, ...

  5. Callable 获取线程返回值

    allable与 Future 两功能是Java在兴许版本号中为了适应多并法才增加的,Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它 ...

  6. 手势(Gesture)的增加和识别

    Android除了提供手势检测之外,还允许把用户手势添加到指定文件中,以备以后使用,当用户再次画出该手势时,系统可识别该手势.Android使用GestureLibrary代表手势库,提供Gestur ...

  7. 重新想象 Windows 8 Store Apps (12) - 控件之 GridView 特性: 拖动项, 项尺寸可变, 分组显示

    原文:重新想象 Windows 8 Store Apps (12) - 控件之 GridView 特性: 拖动项, 项尺寸可变, 分组显示 [源码下载] 重新想象 Windows 8 Store Ap ...

  8. 【原创】leetCodeOj --- Copy List with Random Pointer 解题报告

    题目地址: https://oj.leetcode.com/problems/copy-list-with-random-pointer/ 题目内容: A linked list is given s ...

  9. DiskFileUpload类别

    1.2.2 DiskFileUpload类 DiskFileUpload类是Apache文件上传组件的核心类,应用程序开发者通过这个类来与Apache文件上传组件进行交互.以下介绍DiskFileUp ...

  10. 光谱郑匡移动互联网O2O完美融合

    移动互联网尽管市场颇大,前景广阔,可是由于数据过于密集,非常难精准的定位所谓的目标客户群,然而O2O的线下市场却与互联网市场有极大的反差.一直认为高校周边的小商家是最幸福的生意人,客户明白(就是本校学 ...