неуникальные ограничения

#sql #postgresql #constraints #unique #check-constraints

#sql #postgresql #ограничения #уникальный #проверка-ограничения

Вопрос:

Итак, я попал в такую ситуацию: я создаю таблицу (допустим model_a ), в этой таблице у меня есть 2 столбца (допустим col1 , и col2 ). Мне нужно ограничение, которое удовлетворяет этой реальности:

 model_a

col1 | col2
----- -----
  1  |  1  //first row
  2  |  1  >> ok
  1  |  1  >> ok
  1  |  2  >> can not insert this row
  

Это не УНИКАЛЬНОЕ ограничение, вы можете дублировать первую строку.

Единственное время, когда это ограничение активно col1 , то же самое, но col2 отличается.

Нужна помощь: улыбка: Большое спасибо!

Комментарии:

1. Какую СУБД вы используете?

2. В реляционной базе данных нет такого понятия, как «первая строка». Таблицы представляют неупорядоченные множества.

3. @a_horse_with_no_name . , , Я не думаю, что OP означает «первая строка в таблице», а просто «первая строка в примере», где столбцы равны.

4. Можете ли вы вставить 2/1 более одного раза?

Ответ №1:

Я имею в виду уникальный индекс для наименьшего / наибольшего значения обоих столбцов, который применяется только к строкам, где значения не равны:

 create unique index myidx 
    on model_a (least(col1, col2), greatest(col1, col2))
    where (col1 <> col2)
  

Демонстрация на скрипке DB:

 insert into model_a (col1, col2) values (1, 1); -- ok
insert into model_a (col1, col2) values (2, 1); -- ok
insert into model_a (col1, col2) values (1, 1); -- ok

insert into model_a (col1, col2) values (1, 2);
-- ERROR:  duplicate key value violates unique constraint "myidx"
-- DETAIL:  Key (LEAST(col1, col2), GREATEST(col1, col2))=(1, 2) already exists.
  

Комментарии:

1. Я не чувствую, что данных выборки достаточно для принятия какого-либо решения об алгоритме, но похоже, что когда «первая» строка равна 1, 2, ей разрешено иметь 2,1. Я не понял, какая «одинаковость» проверяется: значение col1 новой строки с col1 любой строки «до» или col1 и col2. Учитывая таблицы, подобные электронной таблице, а не неупорядоченный набор в СУБД.

2. @astentx: насколько я понял вопрос, «первый» относится к порядку, в котором строки добавляются в таблицу, как показано в моей демонстрации. «Первая» строка вполне может быть (1, 2) , и в этом случае (2, 1) последующая вставка будет невозможна.