31

Могу ли я сделать SQL-запросы SQL в контрольном ограничении?SQL-запросы в контрольном ограничении

У меня есть post таблица со столбцами id, owner
Я еще одна таблица action с колоннами user_id, post_id
Таблица user с колоннами id

post_id -> post.id и user_id -> user.id также post.owner -> user.id

Теперь я хочу тягот post(post_id).id != user_id по таблице action

Как это возможно?

+0

Почему это должно иметь значение, если столбец, который ссылается на одну таблицу случается иметь значение * *, который присутствует в другой таблице? В чем проблема, которую вы пытаетесь решить? – SingleNegationElimination

ответ

51

Невозможно смотреть за пределы текущей строки в ограничении CHECK.

http://www.postgresql.org/docs/9.1/interactive/sql-createtable.html говорит:

Проверочное ограничение определяется как ограничение столбца следует ссылаться на значение этого столбца только, в то время как выражение появляется в таблице ограничения могут ссылаться на несколько столбцов.

В настоящее время выражения CHECK не могут содержать подзапросы или не ссылаться на переменные, отличные от столбцов текущей строки.

Есть веские причины для этого ограничения, но если вам нравится жонглировать пылающими факелами во время езды на одном велосипеде посредством интенсивного движения, вы можете подорвать ограничение с помощью функций. Ситуации, в которых это будет не вернуться, чтобы укусить, вы редки; вам было бы намного безопаснее применять инвариант в коде запуска.

http://www.postgresql.org/docs/9.1/interactive/triggers.html

+19

+1 за «жонглирование пылающими факелами во время езды на велосипеде через тяжелое движение» :-) –

+4

Пер [комментарий Том Лэйн] (http://www.postgresql.org/message-id/[email protected]), взломать ограничение подзапросов не рекомендуется: _ «CHECK предназначен для обработки ограничений по значению строки ** в отдельности **. Если вы попытаетесь использовать его для обеспечения условий перекрестных строк, проект, безусловно, закончится плохо. _ – Shane

+2

Да, это правда: «CHECK предназначен для обработки ограничений по значению строки в изоляции». ... Но: что такое уникальное ограничение? «Является ли« жонглирование пылающими факелами во время езды на велосипеде через тяжелое движение »? Я уже пробовал как жонглировать пылающими факелами, так и ездить на одном велосипеде. До сих пор я не могу делать и то, и другое, но, возможно, в будущем. – guettli

Смежные вопросы