TransWikia.com

Ограничение уникальности не действующее на записи с определённым значением колонки

Stack Overflow на русском Asked by J Mas on November 22, 2021

Как я могу задать ограничение на несколько колонок, но при этом исключать определённые не NULL записи?

ALTER TABLE emp 
  ADD CONSTRAINT no_duplicates 
  UNIQUE ( dept, theme, date );

Но есть еще колонка deleted со значениями 0,1. Нужно чтобы ограничение не действовало на записи, где колонка deleted = 0.

2 Answers

Воспользуемся тем фактом, что индексы в Oracle не хранят значения если весь ключ NULL и с ключом NULL может быть сколько угодно значений. Создадим такой уникальный функциональный индекс который для deleted=0 даст сами значения для полей, а для 1 даст для всех NULL.

create unique index emp_uniq on emp(
  decode(deleted,0,dept,NULL),
  decode(deleted,0,theme,NULL),
  decode(deleted,0,date,NULL)
);

Answered by Mike on November 22, 2021

Можно сделать поле deleted целочисленного типа. Тогда процедура "удаления" может выглядеть где-то так

UPDATE emp e
  SET e.deleted =
    (SELECT max(deleted) + 1
     FROM emp i
     WHERE i.dept  = e.dept
       AND i.theme = e.theme
       AND i.date  = e.date)
WHERE e.empid = in_empid;

И можно делать unique constraint по четырём полям


Если приложение ждёт от базы данных только 0 или 1 в поле deleted, можно это решить используя представление или запрос в хранимой процедуре, возвращающей данные.

SELECT 
  e.empid, e.empname, e.dept,
  e.theme, e.date,
  case e.deleted when 0 then 0 else 1 end deleted
  FROM emp e;

Answered by 4per on November 22, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP