oracle的聯合約束(多個欄位的唯一性)

2021-07-25 12:53:07 字數 1174 閱讀 6230

乙個表中  2個字段的聯合約束

建立資料表

create table zcz (id number not null,name varchar(20) null, age varchar(20) null);

建立主鍵 或者聯合主鍵 但乙個表中只能有乙個主鍵

alter table zcz add constraints zcz_pk primary key (id);

alter table zcz add constraints zcz_name_age primary key (name,age);

建立聯合約束(下面該條sql的作用是name和age不能同時相等)

create unique index zcz_name_age on zcz(nvl2(name,age,null),nvl2(name,name,null));

今天在做表約束修改的時候遇到乙個系統需求,假設在同一張表 t 中,有 a,b,c 三個字段,另外有主鍵已經定義好的,現在要求,只要當符合 b<>3 的條件的時候,a,b,c 三個字段聯合唯一,解決方法如下:

建立表的唯一性索引

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));

解析:當 b=3 時,nullif(b,3) 則返回null值, 即nvl2(nullif(b,3),a,null), 返回的是null值,同理,另外兩個nvl2的表示式也是返回null值,因此,三個欄位都認為是null值,所以可以允許插入;

當 b<>3 時,nullif(b,3)則返回 b 值,即nvl2(nullif(b,3),a,null),返回的值是a欄位的值,同理,另外兩個nvl2的表示式返回的分別是b,c欄位的值,這時候進行判斷是否符合唯一性約束。

null指的是空值,或者非法值。

nvl (expr1, expr2)->expr1為null,返回expr2;不為null,返回expr1。注意兩者的型別要一致

nvl2 (expr1, expr2, expr3) ->expr1不為null,返回expr2;為null,返回expr3。expr2和expr3型別不同的話,expr3會轉換為expr2的型別

nullif (expr1, expr2) ->相等返回null,不等返回expr1

oracle的聯合約束(多個欄位的唯一性)

使用oracle資料庫建表的時候,涉及到刪除往往是邏輯刪除,一般的做法就是將某條記錄的active欄位設定為 n 這也就是所謂的邏輯刪除。如員工表,員工工號 code 一般是唯一的,但是員工職位可以變化,那麼就會出現多條記錄,但是只會有一條記錄的active為 y 其餘的都為 n 這樣就不能在cod...

oracle的聯合約束(多個欄位的唯一性)

乙個表中 2個字段的聯合約束 建立資料表 create table zcz id number not null,name varchar 20 null,age varchar 20 null 建立主鍵 或者聯合主鍵 但乙個表中只能有乙個主鍵 alter table zcz add constra...

oracle中distinct多個字段

select distinct t.f resume id t.f resume status t.f resume status,t.f resume status,t.f recruit channel,t.f small channel id from css.t resume info t ...