在约束或检查约束中使用where子句

问题描述 投票:0回答:1

我有一个要求,唯一约束应该基于特定条件。 如果状态列是“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';
sql database oracle unique-constraint
1个回答
0
投票

一些数据库在约束定义中支持

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 问题/答案,它解决了这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.