表的约束

oracle 在表上提供了五种约束

1.not null

  定义在标的列上,表明该列必须要有值,不能为null

  可以在建立表的时候说明

  也可以在表建立以后修改为not null

  可以给约束指定名称

  如果不指定名称,数据库会给一个系统自动指定名称,SYS_C####

scott@TEST>create table t1 (id number(4) not null ,name varchar(3) constraint t1_name not null);  //创建id列有not null约束,不指定名字。name列,指定名字


Table created.

scott@TEST>select CONSTRAINT_NAME,CONSTRAINT_type,TABLE_NAME,column_name from user_constraints natural join user_cons_columns;  //查看数据字典

CONSTRAINT_NAME                                              CO TABLE_NAME                                                   COLUMN_NAME
------------------------------------------------------------ -- ------------------------------------------------------------ ------------
SYS_C0011437                                                 C  T1                                                           ID
T1_NAME                                                      C  T1                                                           NAME
FK_DEPTNO                                                    R  EMP                                                          DEPTNO
PK_DEPT                                                      P  DEPT                                                         DEPTNO
PK_EMP                                                       P  EMP                                                          EMPNO

    也可通过alter来修改

scott@TEST>create table t2 (id number(3));

Table created.

scott@TEST>alter table t2 modify (id not null);  //使用alter添加约束

Table altered.

 2.唯一约束unique

  列的值不能重复

  可以为null

  是用索引来维护唯一的

  索引的名称和约束的名称相同

scott@TEST>create table t1 (id number(5) unique,name varchar(5) constraint t1_name unique);  //创建id列不指定名字,使用系统命名。name列指定名字

Table created.

scott@TEST>select CONSTRAINT_NAME,CONSTRAINT_type,TABLE_NAME,column_name from user_constraints natural join user_cons_columns;  //查看数据字典

CONSTRAINT_NAME                                              CO TABLE_NAME                                                   COLUMN_NAME
------------------------------------------------------------ -- ------------------------------------------------------------ ------------
SYS_C0011439                                                 U  T1                                                           ID
T1_NAME                                                      U  T1                                                           NAME
FK_DEPTNO                                                    R  EMP                                                          DEPTNO
PK_DEPT                                                      P  DEPT                                                         DEPTNO
PK_EMP                                                       P  EMP                                                          EMPNO

scott@TEST>select table_name,index_name,column_name from user_ind_columns;

TABLE_NAME                                                   INDEX_NAME                                                   COLUMN_NAME
------------------------------------------------------------ ------------------------------------------------------------ ------------
DEPT                                                         PK_DEPT                                                      DEPTNO
EMP                                                          PK_EMP                                                       EMPNO
T1                                                           SYS_C0011439                                                 ID
T1                                                           T1_NAME                                                      NAME

  建立表之后指定unique约束

scott@TEST>drop table t1 purge;

Table dropped.

scott@TEST>create table t1 (id number(3),name varchar(4));

Table created.

scott@TEST>alter table t1 add constraint u_id unique (id);  //使用alter增加unique约束

Table altered.

scott@TEST>Select table_name,index_name,column_name from user_ind_columns;

TABLE_NAME                                                   INDEX_NAME                                           COLUMN_NAME
------------------------------------------------------------ ------------------------------------------------------------ ------------
DEPT                                                         PK_DEPT                                              DEPTNO
EMP                                                          PK_EMP                                               EMPNO
T1                                                           U_ID                                                 ID

3.check检测约束

scott@TEST>create table t1(id number(4) constraint c_id check (length(id)>2),name varchar2(5));  //创建id列使用系统命名。

Table created.

scott@TEST>alter table t1 add constraint c_name check(length(name)>2);  //使用alter增加约束

Table altered.

scott@TEST>insert into t1 values(1,'aa');
insert into t1 values(1,'aa')
*
ERROR at line 1:
ORA-02290: check constraint (SCOTT.C_NAME) violated


scott@TEST>insert into t1 values(111,'aaa');

1 row created.

 4.primary key 主键约束

  一个表只能有一个主键

  主键要求唯一并且非空

  可以是联合主键,联合主键每列都要求非空

  主键能唯一地位一行,所以主键也叫逻辑rowid

  主键不是必须的,可以没有

  主键是通过索引实现的

  索引的名称和主键名称相同 

 5.foreign key 外键

  指定在表的列上

  引用本表其它列,或其它表的其它列

  被引用的列得有唯一约束或者主键约束,因为引用的是索引的键值,而不是真正的表

  目的是维护数据的完整性

  核心是一列是另外一列的子集,null除外 

6.删除约束

  任何约束都可以用约束名称来删除

  alter table **** drop constraint ****;

  因为主键只能有一个,所以删除主键约束的时候也可以

  alter table **** drop primary key; 

  如果主键和唯一性约束被删除,自动建立的索引也会同时被清除

  not null 约束也可以用alter table modify 来删除

  删除有外键引用的主键或唯一约束的时候,外键也要被级连删除

  alter table **** drop primary key cascade;

  如果不加cascade,你删不了,报有外键在使用,不能删除。

  按约束的名称来删除约束(可以删除各种约束)

  alter table t1 drop constraint sys_c03033;

  非空约束的第二种删除方式

  alter table t1 modify (name not null);

  alter table t1 modify (name null);

  

原文地址:https://www.cnblogs.com/sangmu/p/6807022.html