#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)
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)
последующая вставка будет невозможна.