一 约束的定义

约束是强加在表上的规则或条件。确保数据库满足业务规则。保证数据的完整性。当对表进行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

oracle 主键_Oracle约束详解相关推荐

  1. ORACLE的索引和约束详解数据库

    ORACLE的索引和约束详解数据库 Oracle的约束 * 如果某个约束只作用于单独的字段,即可以在字段级定义约束,也可以在表级定义约束,但如果某个约束作用于多个字段, 必须在表级定义约束 * 在定义 ...

  2. oracle 主键约束复制,Oracle主键及约束

    Oracle主键Primary Key包含非空约束及唯一约束. 添加主键的语句 alter table table_nameadd constraint cons_name primary key(c ...

  3. Mybatis-Plus主键生成策略详解

    文章目录 前言 一.官网 二.主键注解@TableId说明 1.源码 2.作用 3.使用 三.主键生成策略-IdType枚举说明 1.源码 2.说明 3.全局设置 三.ID生成器介绍 1.Identi ...

  4. ORACLE的索引和约束详解

    Oracle的约束 * 如果某个约束只作用于单独的字段,即可以在字段级定义约束,也可以在表级定义约束,但如果某个约束作用于多个字段, 必须在表级定义约束 * 在定义约束时可以通过CONSTRAINT关 ...

  5. 雪花算法及分布式主键生成策略详解

    目前雪花算法常应用于分布式环境下作为分布式主键的首选,本文详细介绍下雪花算法及相关分布式主键的生成策略. 如下内容已本文PPT讲解内容为基础. 本次内容共包括4部分:分布式主键生成策略,雪花算法详解, ...

  6. 2005数据库导入mysql没有主键_mysql数据库详解(续二)

    mysql数据库登陆问题解决汇总 首先需要说明一下,MYSQL数据库登陆的方式,通常就是本地登陆(localhost)和远程登陆,那么这里在深入地了解一部localhost和127.0.0.1的区别是 ...

  7. hibernate 7大主键生成策略详解与对象状态

    一:代理主键_主键自增 1.identity 1.采用底层数据库本身提供的主键生成标识符,条件是数据库支持自动增长数据类型 2.该生成器要求在数据库中把主键定义成为自增长类型.适用于代理主键 2.in ...

  8. 主键由数据库mysql 映射native_Hibernate主键生成策略详解

    转载自:http://blog.csdn.net/wanghuan203/article/details/7562395 hibernate提供的主键生成策略,使我们可以在实体类的映射xml文件中设定 ...

  9. mysql 主键溢出检查_详解MySQL 表中非主键列溢出情况监控

    今天,又掉坑了. 之前踩到过MySQL主键溢出的情况,通过prometheus监控起来了. 这次遇到的坑,更加的隐蔽. 是一个log表里面的一个int signed类型的列写满了.快速的解决方法当然还 ...

最新文章

  1. wangEditor 菜单栏随页面滚动位置改变(吸顶)问题解决
  2. Jedis使用总结【pipeline】【分布式的id生成器】【分布式锁【watch】【multi】】【redis分布式】
  3. IOS学习之多线程(9)--NSOperation简单介绍
  4. LVM管理-元数据及分区表的恢复
  5. plsql连不上oracle6,是否遇到PLSQL Developer连不到oracle数据库呢
  6. php 数组 indexof,详解js中字符串和数组的indexof方法
  7. Lock和synchronized的区别和使用(转载)
  8. 操作系统_实验报告_Lab1
  9. 使用JS导出表格为Excel
  10. STM8S自学笔记-005 精准延时
  11. java实训任务_java实训任务
  12. 我的第一个MASM32程序(MASM32环境配置)
  13. 10款UI设计师常用的UI设计工具盘点
  14. python基础之字典函数(12)
  15. 正则表达式 /^[0-9]+$/
  16. 电脑启动卡、慢,运行起来后,可能可以慢慢恢复正常问题的原因和解决方案
  17. ESP32-CAM与Tonny搭建问题。
  18. Java秒杀系统实战系列~构建SpringBoot多模块项目
  19. 论文笔记 -- Fast-LIO -- ESIKF溯源
  20. web表格控件FineReport作为企业web表格制作软件的核心优势

热门文章

  1. GO语言使用的几个注意点
  2. List集合去重的一种方法
  3. puppet-dashboard 安装(草稿)
  4. Hibernate 性能优化技巧
  5. python SSL error: [SSL: TLSV1_ALERT_PROTOCOL_VERSION] tlsv1 alert protocol version (_ssl.c:590) 解决方法
  6. java rmi 原理和使用浅析
  7. centos7 开启 关闭 NetworkManager
  8. centos7 安装 xfce桌面
  9. mysql数据库 一条语句实现记录存在则更新,不存在则插入
  10. searchsploit工具(exploit-db.com)使用实例 (linux 内核漏洞提权) exploitdb