關於主鍵約束enable和disable的問題

2021-08-03 12:30:59 字數 951 閱讀 5201

當我們在建立主鍵約束的時候,會自動建立乙個唯一索引(唯一約束也是如此)

其實對於主鍵約束而言,它是非空約束+唯一約束的組合。而自動建立的唯一索引,就是用來實現唯一性這一規則的。

當我們disable掉主鍵約束後,它會自動刪掉當初自動建立的唯一索引。

同理,當我們enable主鍵後,它又會自動建立唯一索引。

另外,當我們disable約束後,像主鍵中插入null值後是被允許的,但當我們再次enable主鍵約束,便會報錯:

sql> insert into test values(null);

1 row created.

sql> commit;

commit complete.

sql> alter table test enable constraint pk_id;

alter table test enable constraint pk_id

*error at line 1:

ora-02437: cannot validate (sys.pk_id) - primary key violated

所以,對於約束enable過程,又涉及到乙個對原有資料是否做約束檢查問題。

對於上述情況,可以novalidate,即允許原有資料中存在不符合主鍵約束的值:

sql> alter table test enable novalidate constraint pk_id;

table altered.

但是,約束啟用後,就不允許有違反約束的值了

sql> insert into test values(null);

insert into test values(null)

*error at line 1:

ora-01400: cannot insert null into ("sys"."test"."id")

記錄一些細節,有時候真是記不清。

主鍵 約束和索引

1 主鍵約束不允許出現 null 值。任何索引條目的索引鍵都不允許包含null。唯一約束允許包含 null 值,但唯一約束把兩個 null 值當作重複值,所以施加了唯一約束的每一列只允許包含乙個 null 值。2 建立主鍵時會自動建立聚集索引,除非當前表中已經含有了聚集索引或是建立主鍵時指定了 no...

關於IOC和DI討論

這是直接擷取的ppt的內容,我真不知道這樣來描述這所謂的2個概念需要讓看客們如何理解.同時我們可以去看看 martin fowler的 inversion of control containers and the dependency injection pattern 或者中文版本 在這個文章中...

SQL 主鍵和外來鍵約束

sql 的主鍵和外來鍵的作用 外來鍵取值規則 空值或參照的主鍵值。1 插入非空值時,如果主鍵表中沒有這個值,則不能插入。2 更新時,不能改為主鍵表中沒有的值。3 刪除主鍵表記錄時,你可以在建外鍵時選定外來鍵記錄一起級聯刪除還是拒絕刪除。4 更新主鍵記錄時,同樣有級聯更新和拒絕執行的選擇。簡而言之,s...