1. 程式人生 > >oracle 唯一約束 和 唯一索引

oracle 唯一約束 和 唯一索引

唯一性約束

唯一性約束指表中一個欄位或者多個欄位聯合起來能夠唯一標識一條記錄的約束。聯合欄位中,可以包含空值。
注:在Oracle中,唯一性約束最多可以有32列。
唯一性約束可以在建立表時或使用ALTER TABLE語句建立。

唯一性約束和主鍵的區別
主鍵(Primary Key):所有組成主鍵的列都不能包含空值。唯一性約束(Unique Constraint):如果唯一性約束由多列組成,其中的部分列可以包含空值。Oracle中不容許在相同列上既建立主鍵又建立唯一性約束。

1、建立聯合約束(下面該條sql的作用是STAFF_ID, FIRST_NAME, LAST_NAME不能同時相等)

eg:

alter table T_GJCX_EMP

  add constraint T_GJCX_EMP_JOINT_KEY unique (STAFF_ID, FIRST_NAME, LAST_NAME)
(1)基於單列的唯一性約束
alter table tb_supplier
add constraint  tb_supplier_u1
unique (supplier_id);

(2)基於多列的唯一性約束
alter table tb_products
add constraint  tb_products_u1
unique (product_id,product_name);

2 、禁用唯一性約束


(1)語法:
ALTER TABLE table_name
DISABLE CONSTRAINT constraint_name;
(2)示例:
ALTER TABLE tb_supplier
DISABLE CONSTRAINT  tb_supplier_u1;

問題:

建立表的唯一性索引【CREATE UNIQUE INDEX idx_ut ON t(NVL2(NULLIF(b,3),a,NULL),NVL2(NULLIF(b,3),b,NULL),NVL2(NULLIF(b,3),c,NULL))】

和建立表的唯一性約束的異同:
唯一約束可以用於保證在基表中增加一條記錄時,一個或多個列值是唯一的。如果已經給一個或以上列定義了唯一約束,那麼任何操作都不可能替換這些列中的複製的值。儘管唯一的、系統要求的索引是用來加強唯一約束,但是定義唯一約束和建立唯一索引之間還是有區別的。即使這二者之間都可以增強唯一性,唯一索引允許NULL值並且一般不能用在指示性約束中。換句話說,唯一約束不允許NULL值並能在外來鍵規範中使用( "NULL"的意思就是列值不明確並且和其他值不同,還包括其他NULL值)。

總結:唯一索引就是唯一索引,唯一約束是通過唯一索引來實現的,建立唯一約束時會建立一個唯一索引 前提條件是約束列上沒有唯一索引。