当我删除一张表时,它是否也会删除约束条件?
这里是一个简单的表格。它有一个索引、一些完整性约束和一个触发器:
SQL> desc t69
Name Null? Type
------------------ -------- ----------------------------
ID NOT NULL NUMBER
SQL> select index_name from user_indexes where table_name = 'T69';
INDEX_NAME
------------------------------
SYS_C0034158
SQL> select constraint_name, constraint_type from user_constraints where table_name = 'T69';
CONSTRAINT_NAME C
------------------------------ -
SYS_C0034157 C
SYS_C0034158 P
SQL> select trigger_name from user_triggers where table_name = 'T69';
TRIGGER_NAME
------------------------------
TRG69
SQL>
我们能否不再提及这件事?是的,我们可以!
SQL> drop table t69;
Table dropped.
SQL> select constraint_name, constraint_type from user_constraints where table_name = 'T69';
no rows selected
SQL> select trigger_name from user_triggers where table_name = 'T69';
no rows selected
SQL>
SQL> select index_name from user_indexes where table_name = 'T69';
no rows selected
SQL>
一无所有。当其他对象引用该表时就不同了。
还有另一张表,P23。它被一个外键引用并在一个视图中使用。
SQL> create table c23 (id number, p_id number);
Table created.
SQL> alter table c23 add foreign key (p_id) references p23;
Table altered.
SQL> create view v23 as select * from p23;
View created.
SQL>
那么我们可以删除这张表吗?
SQL> drop table p23 ;
drop table p23
*
ERROR at line 1:
ORA-02449: unique/primary keys in table referenced by foreign keys
SQL>
不,我们不能这样做。顺便提一下,关于RESTRICT语法,Oracle不支持该语法。其实也没有必要使用它,因为我们无法删除强制执行关系完整性的表...除非我们坚持这样做:
SQL> drop table p23 cascade constraints;
Table dropped.
SQL> desc t23
Name Null? Type
----------------------------------------- -------- ----------------------------
COLA NUMBER
COLB NUMBER
COLC NUMBER
GENDER VARCHAR2(1)
ID NUMBER
SQL> select * from v23
2 /
select * from v23
*
ERROR at line 1:
ORA-04063: view "FOX.V23" has errors
SQL>
CASCADE CONSTRAINTS子句会删除该表及引用它的任何外键。子表保持不变。引用该表的视图(以及任何 PL/SQL)将保留但处于无效状态。
级联约束
。这只适用于外键约束。 - user330315drop table
的工作原理oracle doc。 - Seyran