日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle银行卡号检查约束,oracle约束学习(1)unique和check

發布時間:2025/4/16 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle银行卡号检查约束,oracle约束学习(1)unique和check 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

有人說,沒有索引, 拿什么來保證約束?姑且不論這話的對錯,但約束的實現(除了not null),很多都是通過索引來快速定位約束的地方。unique約束會自動建立索引,pk也是。也因此,約束的很多問題總是和索引纏綿一起。

相關視圖:

dba_constraints

dba_cons_columns

not null約束比較特別點。not null的索引類型和check約束一樣,都是C。只有not null這種約束才會被繼承,記住這一點,在復制表時,別忘了加約束、索引等。

unique? 約束

延遲驗證屬性:deferrable/not deferrable, Deferred/immediate

延遲約束在提交的時候才進行校驗,大多數是這樣的。

not deferrable:不提交也檢查,這是缺省值。

SQL> select * from hr.t1;

ID NAME

---------- ----------------------------------------

1 d

2 b

SQL> conn hr/hr

已連接。

SQL> alter table t1 add constraint t1_u_1 unique(id); -- 默認情況下是not deferrable & immediate

表已更改。

SQL> insert into t1 values(1,\'c\');

insert into t1 values(1,\'c\')

*

第 1 行出現錯誤:

ORA-00001: 違反唯一約束條件 (HR.T1_U_1)

SQL> alter table t1 drop constraint t1_u_1 cascade;

表已更改。

SQL> alter table t1 add constraint t1_u_2 unique(id) deferrable; --deferrable & immediate

表已更改。

SQL> select * from t1;

ID NAME

---------- ----------------------------------------

1 d

2 b

SQL> insert into t1 values(1,\'c\');

insert into t1 values(1,\'c\')

*

第 1 行出現錯誤:

ORA-00001: 違反唯一約束條件 (HR.T1_U_2)

為什么延遲還還報錯呢?延遲性約束,索引必須非唯一。enable novalidate也必須是非唯一索引。然而,我們在建unique約束的時候,oracle會隱士的先創建一個唯一性索引,而且索引的名字和約束的名字是一樣的。再來建立約束,除非這個列本來有一個約束。

SQL> alter table t1 add constraint t1_u_6 unique(id);

表已更改。

SQL> select index_name,uniqueness from user_indexes ;

INDEX_NAME UNIQUENESS

------------------------------------------------------------ ------------------

T1_U_6 UNIQUE

SQL> alter table t1 add constraint t1_u_3 unique(id) deferrable; --deferrable & immediate

表已更改。

SQL> select * from t1;

ID NAME

---------- ----------------------------------------

1 d

2 b

SQL> insert into t1 values(1,\'c\');

insert into t1 values(1,\'c\')

*

第 1 行出現錯誤:

ORA-00001: 違反唯一約束條件 (HR.T1_U_3)

SQL> alter table t1 drop constraint t1_u_3 cascade;

表已更改。

SQL> drop index t1_index;

索引已刪除。

SQL> create unique index t1_index on t1(id);

索引已創建。

SQL> select index_name,uniqueness from user_indexes;

INDEX_NAME UNIQUENESS

------------------------------------------------------------ ------------------

T1_INDEX UNIQUE

SQL> alter table t1 add constraint t1_u_4 unique(id) deferrable;

alter table t1 add constraint t1_u_4 unique(id) deferrable

*

第 1 行出現錯誤:

ORA-01408: 此列列表已索引

SQL> drop index t1_index;

索引已刪除。

SQL> alter table t1 drop constraint t1_u_4 cascade;

alter table t1 drop constraint t1_u_4 cascade

*

第 1 行出現錯誤:

ORA-02443: 無法刪除約束條件 - 不存在的約束條件

SQL> alter table t1 add constraint t1_u_5 unique(id) initially deferred deferrable; --若是not deferrable,則只能跟immediate

表已更改。

SQL> select * from t1;

ID NAME

---------- ----------------------------------------

1 d

2 b

SQL> insert into t1 values(1,\'c\');

已創建 1 行。

SQL> insert into t1 values(1,\'d\');

已創建 1 行。

SQL> commit;

commit

*

第 1 行出現錯誤:

ORA-02091: 事務處理已回退

ORA-00001: 違反唯一約束條件 (HR.T1_U_5)

immediate deferrable是立馬延遲,而deferred deferrable則是在commit時給回滾掉。

check

validate會檢查舊值,而novalidate不會。這個運用可以用來避免前臺小姐誤操作。

SQL> select * from t1;

ID NAME

---------- ----------------------------------------

1 d

2 b

3 c

4 c

SQL> alter table t1 add constraint t1_u_6 check(id>10) validate;

alter table t1 add constraint t1_u_6 check(id>10) validate

*

第 1 行出現錯誤:

ORA-02293: 無法驗證 (HR.T1_U_6) - 違反檢查約束條件

SQL> alter table t1 add constraint t1_u_6 check(id>10) novalidate;

表已更改。

SQL> select * from t1;

ID NAME

---------- ----------------------------------------

1 d

2 b

3 c

4 c

SQL> insert into t1 values(5,\'d\');

insert into t1 values(5,\'d\')

*

第 1 行出現錯誤:

ORA-02290: 違反檢查約束條件 (HR.T1_U_6)

SQL> alter table t1 add constraint t1_u_6 check(id>10) enable novalidate;

表已更改。

SQL> insert into t1 values(6,\'d\');

insert into t1 values(6,\'d\')

*

第 1 行出現錯誤:

ORA-02290: 違反檢查約束條件 (HR.T1_U_6)

SQL> select * from t1;

ID NAME

---------- ----------------------------------------

1 d

2 b

3 c

4 c

SQL> alter table t1 add constraint t1_u_6 check(id>10) disable novalidate;

表已更改。

SQL> select * from t1;

ID NAME

---------- ----------------------------------------

1 d

2 b

3 c

4 c

SQL> insert into t1 values(5,\'s\');

已創建 1 行。

SQL> commit;

提交完成。

約束的優先級比約束的屬性來得高。

SQL> create table t1 (id number,constraint t1_u_6 check(id>3) validate);

表已創建。

SQL> insert into t1 values(1);

insert into t1 values(1)

*

第 1 行出現錯誤:

ORA-02290: 違反檢查約束條件 (HR.T1_U_6)

SQL> insert into t1 values(5);

已創建 1 行。

SQL> drop table t1 purge;

表已刪除。

SQL> create table t1(id number,constraint t1_u_6 check(id>3) novalidate);

表已創建。

SQL> insert into t1 values(1);

insert into t1 values(1)

*

第 1 行出現錯誤:

ORA-02290: 違反檢查約束條件 (HR.T1_U_6)

SQL> insert into t1 values(5);

已創建 1 行。

SQL> select * from t1;

ID

----------

5

SQL> alter table t1 add constraint t1_u_6 check(id>10) novalidate;

表已更改。

SQL> insert into t1 values(3);

insert into t1 values(3)

*

第 1 行出現錯誤:

ORA-02290: 違反檢查約束條件 (HR.T1_U_6)

SQL> insert into t1 values(7);

insert into t1 values(7)

*

第 1 行出現錯誤:

ORA-02290: 違反檢查約束條件 (HR.T1_U_6)

SQL> insert into t1 values(11);

已創建 1 行。

SQL> select * from t1;

ID

----------

5

11

總結

以上是生活随笔為你收集整理的oracle银行卡号检查约束,oracle约束学习(1)unique和check的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。