约束的DEFERRABLE, NOT DEFERRABLE, INITIALLY IMMEDIATE 和 INITIALLY DEFERRED
[ CONSTRAINT constraint_name ]
{ NOT NULL |
NULL |
CHECK ( expression ) [ NO INHERIT ] |
DEFAULT default_expr |
UNIQUE index_parameters |
PRIMARY KEY index_parameters |
REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
[ ON DELETE action ] [ ON UPDATE action ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
DEFERRABLE(可以推遲的約束檢查):可以推遲到事務結尾。目前僅UNIQUE, PRIMARY KEY, EXCLUDE和FOREIGN KEY才支持DEFERRABLE。NOT NULL和CHECK約束不支持。
NOT DEFERRABLE(不可推遲的約束檢查):在每一個命令后會立即驗證是否滿足約束條件。缺省是NOT DEFERRABLE。
如果約束是INITIALLY IMMEDIATE,那么每條語句之后就檢查它。這個是缺省。
如果約束是INITIALLY DEFERRED,那么直到事務完成才檢查。
檢查的時間可以用以下命令修改:
SET CONSTRAINTS [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
例子:
默認是NOT DEFERRABLE INITIALLY IMMEDIATE
create table t1 (id number, name char(10));
alter table t1 modify id number primary key;
SQL> insert into t1 values(1,'Tough1');
已創建 1 行。SQL> insert into t1 values(1,'Tough1');
insert into t1 values(1,'Tough1')
*
第 1 行出現錯誤:
ORA-00001: 違反唯一約束條件 (SCOTT.SYS_C005428)
DEFERRABLE或INITIALLY DEFERRED的情況:
create table t2 (id number, name char(10));
alter table t2 modify id number primary key INITIALLY DEFERRED;
或
alter table t2 modify id number primary key DEFERRABLE INITIALLY DEFERRED;
SQL> insert into t2 values(1,'Tough1');
已創建 1 行。
SQL> insert into t2 values(1,'Tough1');
已創建 1 行。
SQL> commit;
commit
*
第 1 行出現錯誤:
ORA-02091: 事務處理已回退
ORA-00001: 違反唯一約束條件 (SCOTT.SYS_C005435)
總結
以上是生活随笔為你收集整理的约束的DEFERRABLE, NOT DEFERRABLE, INITIALLY IMMEDIATE 和 INITIALLY DEFERRED的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python写mapreduce_用py
- 下一篇: mysql 连续签到天数_新版签到活动明