SCOTT@ORA11GR2>SELECT t.table_name, t.column_name, d.constraint_type, d.constraint_name
FROM user_constraints d, user_cons_columns t
WHERE d.constraint_name = t.constraint_name
AND t.table_name = upper(' t1');
TABLE_NAME COLUMN_NAME CONSTRAINT_TYPE CONSTRAINT_NAME
--------------- --------------- ------------------ --------------------
T1 B U UK_T1_A
T1 A P PK_T1_A
SCOTT@ORA11GR2>
SCOTT@ORA11GR2>SELECT t.table_name, t.column_name, d.constraint_type, d.constraint_name
FROM user_constraints d, user_cons_columns t
WHERE d.constraint_name = t.constraint_name
AND t.table_name = upper(' t2');
TABLE_NAME COLUMN_NAME CONSTRAINT_TYPE CONSTRAINT_NAME
--------------- --------------- ------------------ --------------------
T2 B U UK_T2_A
T2 A P PK_T2_A
SCOTT@ORA11GR2>
SCOTT@ORA11GR2>select index_name,uniqueness,tablespace_name from user_indexes where table_name=upper(' t1');
INDEX_NAME UNIQUENES TABLESPACE_NAME
------------------------------ --------- ------------------------------
UIDX_T1_B UNIQUE USERS
UIDX_T1_A UNIQUE USERS
SCOTT@ORA11GR2>select index_name,uniqueness,tablespace_name from user_indexes where table_name=upper(' t2');
INDEX_NAME UNIQUENES TABLESPACE_NAME
------------------------------ --------- ------------------------------
IDX_T2_B NONUNIQUE USERS
IDX_T2_A NONUNIQUE USERS
SCOTT@ORA11GR2>
八:t1表插入测试数据
SCOTT@ORA11GR2>insert into t1 values(null,1);
insert into t1 values(null,1)
*
ERROR at line 1:
ORA-01400: cannot insert NULL into ("SCOTT"."T1"."A")
SCOTT@ORA11GR2>insert into t1 values(1,null);
1 row created.
SCOTT@ORA11GR2>insert into t1 values(2,1);
1 row created.
SCOTT@ORA11GR2>commit;
Commit complete.
SCOTT@ORA11GR2>select * from t1;
A B
---------- ----------
1
2 1
SCOTT@ORA11GR2>insert into t1 values(2,2);
insert into t1 values(2,2)
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.PK_T1_A) violated
SCOTT@ORA11GR2>insert into t1 values(3,1);
insert into t1 values(3,1)
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.UK_T1_A) violated
SCOTT@ORA11GR2>
t1表验证结果:
主键无法插入null值,唯一键可以插入null值,主键和唯一键都不能重复
九:t2表插入测试数据
SCOTT@ORA11GR2>insert into t2 values(null,1);
insert into t2 values(null,1)
*
ERROR at line 1:
ORA-01400: cannot insert NULL into ("SCOTT"."T2"."A")
SCOTT@ORA11GR2>insert into t2 values(1,null);
1 row created.
SCOTT@ORA11GR2>insert into t2 values(2,1);
1 row created.
SCOTT@ORA11GR2>commit;
Commit complete.
SCOTT@ORA11GR2>select * from t2;
A B
---------- ----------
1
2 1
SCOTT@ORA11GR2>
SCOTT@ORA11GR2>insert into t2 values(2,2);
insert into t2 values(2,2)
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.PK_T2_A) violated
SCOTT@ORA11GR2>insert into t2 values(3,1);
insert into t2 values(3,1)
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.UK_T2_A) violated
SCOTT@ORA11GR2>
t2表验证结果同t1表
十:删除约束
1)删除t1约束
SCOTT@ORA11GR2>alter table t1 drop constraint uk_t1_a;
Table altered.
SCOTT@ORA11GR2>alter table t1 drop constraint pk_t1_a;
Table altered.
SCOTT@ORA11GR2>
SCOTT@ORA11GR2>SELECT t.table_name, t.column_name, d.constraint_type, d.constraint_name
FROM user_constraints d, user_cons_columns t
WHERE d.constraint_name = t.constraint_name
AND t.table_name = upper('t1');
no rows selected
SCOTT@ORA11GR2>
SCOTT@ORA11GR2>select index_name,uniqueness,tablespace_name from user_indexes where table_name=upper('t1');
INDEX_NAME UNIQUENES TABLESPACE_NAME
------------------------------ --------- ------------------------------
UIDX_T1_B UNIQUE USERS
UIDX_T1_A UNIQUE USERS
SCOTT@ORA11GR2>
2)删除t2约束
SCOTT@ORA11GR2>alter table t2 drop constraint uk_t2_a cascade;
Table altered.
SCOTT@ORA11GR2>alter table t2 drop primary key;
Table altered.
SCOTT@ORA11GR2>
SCOTT@ORA11GR2>SELECT t.table_name, t.column_name, d.constraint_type, d.constraint_name
FROM user_constraints d, user_cons_columns t
WHERE d.constraint_name = t.constraint_name
AND t.table_name = upper('t2');
no rows selected
SCOTT@ORA11GR2>
SCOTT@ORA11GR2>select index_name,uniqueness,tablespace_name from user_indexes where table_name=upper('t2');
INDEX_NAME UNIQUENES TABLESPACE_NAME
------------------------------ --------- ------------------------------
IDX_T2_B NONUNIQUE USERS
IDX_T2_A NONUNIQUE USERS
SCOTT@ORA11GR2>
注:我印象中,在删除唯一约束的时候,加上cascade子句,那么,会级联删除相关的索引,可以通过最近的测试发现,如果索引是唯一约束自动创建的,那么不加cascade也能将索引删除,如果在已存在的索引上创建唯一约束,那么加不加cascade都无法级联删除索引,这个可以理解,因为那个索引本身就不是你创建的,可是自动创建的索引怎么跟我以前测试的不同了,难道我记错了?
小结:
1)在已存在索引的基础上创建约束,无论已存在的索引是唯一的还是普通的,那么他们的约束都是起作用的(不过,普通索引和唯一索引上创建的约束,在生成执行计划的时候,应该是不同的),也就是说,主键约束和唯一键约束的唯一性不单单是有唯一索引控制的,本身主键约束和唯一键约束就有控制唯一的能力。
2)删除在已存在索引上创建的约束,那么只删除约束,对索引没有什么影响。
3)第十步中删除主键的方法有两种,一种是利用主键约束的名称删除,另一种是直接删除表中的主键(因为一张表中只允许有一个主键,索引,oracle也支持直接删除primary key)