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

2021-07-10 11:16:36 字數 718 閱讀 9098

使用oracle資料庫建表的時候,涉及到刪除往往是邏輯刪除,一般的做法就是將某條記錄的active欄位設定為『n』,這也就是所謂的邏輯刪除。

如員工表,員工工號(code)一般是唯一的,但是員工職位可以變化,那麼就會出現多條記錄,但是只會有一條記錄的active為『y』,其餘的都為『n』,

這樣就不能在code這個欄位上加唯一索引。實際的情況是如果active為『y』那麼code和active=『y』為唯一;如果active為『n』,那麼code可以有多條記錄。

怎麼解決這個問題呢,我們可以使用組合唯一索引的方式來從資料庫層面來解決。

下面是例子:

/*(1)active為 'y': code 和active為唯一約束

(2)active為 'n': (null,null)為唯一約束

*/create table t_mytest(

code varchar2(8),

active char(1)

);/*第一種方式*/

create unique index idx_t_mytest on t_mytest(nvl2(nullif(active,'n'),code,null),nvl2(nullif(active,'n'),active,null));

/*第二種方式*/

create unique index idx_t_mytest on t_mytest(decode(active,'y',code,null))

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

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

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 ...