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