需求是status為new的id需要唯一,其他的數(shù)據(jù)不做要求。
drop table test purge;
create table test( id number, status varchar2(10));create unique index uind_t_id on test(decode(status,'new',id,null));insert into test values(1,'new'); commit;insert into test values(2,'new'); commit;insert into test values(1,'old'); commit;insert into test values(2,'old'); commit;insert into test values(1,'new'); *第 1 行出現(xiàn)錯誤:ORA-00001: 違反唯一約束條件 (UIND_T_ID)
insert into test values(2,'old'); commit;
select * from test; ID STATUS------- ---------- 1 new 2 new 1 old2 old
2 old
可能有同學要問為什么status和id建一個聯(lián)合的唯一索引,這種做法達不到要求,實驗一下:
truncate table test;drop index uind_t_id; create unique index uind_t_id on test(id,status);insert into test values(1,'new'); commit;insert into test values(2,'new'); commit;insert into test values(1,'old'); commit;insert into test values(2,'old'); commit;insert into test values(1,'new')*第 1 行出現(xiàn)錯誤:ORA-00001: 違反唯一約束條件 (SPROC4GD_DEV.UIND_T_ID)insert into test values(2,'old')*第 1 行出現(xiàn)錯誤:ORA-00001: 違反唯一約束條件 (SPROC4GD_DEV.UIND_T_ID)select * from test; ID STATUS---------- ---------- 1 new 2 new 1 old 2 old
可以看到這個不滿足其他的數(shù)據(jù)不做要求的需求。
新聞熱點
疑難解答