我有一个要求,唯一约束应该基于特定条件。 如果状态列是“LIVE”,则不应允许同一 algo_id 存在另一个实时记录。 当我对这两列施加唯一约束时,它不允许添加多个“旧”状态记录。
TABLE: ALGO
ID : Number(10) -- PK
Algo_id VARCHAR2(30) NOT NULL,
Status VARCHAR2(30) NOT NULL,
Algo_id Status
ALGO-123 OLD
ALGO-123 OLD
ALGO-123 LIVE
ALGO-234 REMOVED
ALGO-234 REMOVED
ALGO-234 LIVE
ALGO-234 LIVE <This should not allow as there is already live record for ALGO-234>
谢谢提前。
我已经尝试过以下
ALTER TABLE ALGO
ADD CONSTRAINT unique_live_algo UNIQUE (algo_id, stats );
有没有办法我可以提出如下条件:
ALTER TABLE ALGO
ADD CONSTRAINT unique_live_algo UNIQUE (algo_id, stats ) where/when Status = 'LIVE';
一些数据库在约束定义中支持
WHERE
,但Oracle似乎不支持这一点。但是,我们可以尝试在这里使用基于唯一函数的索引:
ALTER TABLE ALGO
ADD CONSTRAINT unique_live_algo UNIQUE (
CASE WHEN Status = 'LIVE' THEN algo_id END,
CASE WHEN Status = 'LIVE' THEN Status END
);
对于那些不具有
LIVE
状态的记录,元组中的两个值都只是NULL
。由于 Oracle 允许多个具有唯一约束的 NULL
值,因此允许重复。否则,将向 (algo_id, Status)
应用唯一约束。
我赞扬这个出色的 DBA Stack Exchange 问题/答案,它解决了这个问题。