Добавить уникальный столбец, когда у меня есть условие - PullRequest
1 голос
/ 13 июня 2019

У меня есть таблица Это поле таблицы

project_labor
PROJECT_NO, LABOR_ID, STATUS

поле состояния имеет два значения (полное или полное)
если значение статуса (завершено), идентификатор труда можно повторить
но если значение статуса (неполное), идентификатор работы должен быть уникальным

1 Ответ

2 голосов
/ 13 июня 2019

Вы можете использовать индекс функции (по умолчанию NULL значение для индекса одного столбца пропускается):

CREATE UNIQUE INDEX IX_name 
ON project_labor (CASE WHEN STATUS='complete' THEN NULL ELSE LABOR_ID END);

ДБ <> Fiddle demo

Полный скрипт:

CREATE TABLE project_labor(PROJECT_NO INT, LABOR_ID INT, STATUS VARCHAR2(10));

CREATE UNIQUE INDEX IX_name 
ON project_labor (CASE WHEN STATUS='complete' THEN NULL ELSE labor_id END);

INSERT INTO project_labor(project_no,status,labor_id) VALUES(1, 'uncomplete', 1);
INSERT INTO project_labor(project_no,status,labor_id) VALUES(2, 'uncomplete', 1);
-- ORA-00001: unique constraint (IX_NAME) violated

INSERT INTO project_labor(project_no,status,labor_id) VALUES(3, 'complete', 2)
INSERT INTO project_labor(project_no,status,labor_id) VALUES(4, 'complete', 2)

SELECT * FROM project_labor

Это эквивалент частичного индекса из других СУБД:

PostgreSQL - частичный индекс / SQLite - частичный индекс / SQL Server - отфильтрованный индекс

...