首页 > oracle Constraint(转)

oracle Constraint(转)

约束简介

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

合约束,那么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约束既可以在列级定义,也可以在表级定义。

关键字说明:

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

更多相关:

  • 引言 在这个-SLAM建图和导航仿真实例-项目中,主要分为三个部分,分别是 (一)模型构建(二)根据已知地图进行定位和导航(三)使用RTAB-MAP进行建图和导航 该项目的slam_bot已经上传我的Github。 这是第三部分,完成效果如下 图1 建图和导航 三、使用RTAB-Map进行建图和导航 1. rtab...

  • 引言 在这个-SLAM建图和导航仿真实例-项目中,主要分为三个部分,分别是 (一)模型构建(二)根据已知地图进行定位和导航(三)使用RTAB-MAP进行建图和导航 该项目的slam_bot已经上传我的Github。 由于之前的虚拟机性能限制,我在这个项目中使用了新的ubantu 16.04环境,虚拟机配置 内存 8GCPU...

  • [{name:1},{name:2}].forEach((v,i,ar) => {console.log(v,i,ar)});//基础遍历[{name:1},{name:2}].map((v) => v.name);//[1,2]返回对象数组中指定字段值的一位数组(不改变原始数组)[{name:1},{name:2},{name:3}...

  • 体验内容 使用gmapping方法利用turtlebot底盘移动信息和激光雷达数据进行建图。 1. 安装一些依赖包 sudo apt-get install ros-melodic-move-base* sudo apt-get install ros-melodic-map-server* sudo apt-get insta...

  • 前言 我们知道Java/Python这种语言能够很好得 支持反射。反射机制 就是一种用户输入的字符串到对应实现方法的映射,比如http接口中 用户传入了url,我们需要调用该url对应的方法/函数对象 从而做出对应的操作。 而C++ 并没有友好得支持这样的操作,而最近工作中需要通过C++实现http接口,这个过程想要代码实现得优雅...

  • 这里将分享我使用PCL库的遇到的一些坑,以及总结的技巧,当然也需要各位能够多多分享,将公众号的文章或者知识星球的文章转发到朋友圈。 pcl_common中主要是包含了PCL库常用的公共数据结构和方法,比如PointCloud的类和许多用于表示点,曲面,法向量,特征描述等点的类型,用于计算距离,均值以及协方差,角度转换以及几何变化的函...

  • C++中extern是指全局的意思。它一般有两个方面的用途: 1、声明变量 首先说一下声明和定义的区别: ①变量的定义:用于为变量分配存储空间,还可以为变量指定初始值。在一个程序中,变量有且仅有一个定义。 ②变量的声明:用于向程序表明变量的类型和名字。定义也是声明:当定义变量时我们声明了它的类型和名字。可以通过使用extern...

  • 在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类A类B,A中使用了B定义的类型,B中也使用了A定义的类型 class A {     int i;     B b; } class B {     int i;     A* a; } 请注意上面的定义内容,一般情况下是不能出现类A,类B相互引用都定义对象,即...

  •   前天在玩OLED时想完成一直想弄得一个东西,就是简单的单片机游戏。因为STM32和nRF51822的内存足够,所以就用缓存数组的方法来显示图像(我也不知道术语是啥,反正就是在内存中建立一个128X64的二维数组,更新显示时将整个数组刷新到屏幕上),而且这两个OLED是串口的(还有一个128X32的OLED,一样串口的,连驱动时序和...

  • 三、继承中容易引起的错误有时候继承也会带来些错误,比如说下面这条css定义: body{color:blue} 在有些浏览器中这句定义会使除表格之外的文本变成蓝色。从技术上来说,这是不正确的,但是它确实存在。所以我们经常需要借助于某些技巧,比如将css定义成这样: body,table,th,td{color:blue} 这样表格...