Можно / как добавить круг ссылок, не нарушая РИ?
-
05-07-2019 - |
Вопрос
Меня в первую очередь интересует pgsql, но мне было интересно, есть ли способ в любой СУБД выполнить операцию вставки, без , отключив и повторно включив любой FOREIGN KEY или NOT NULL ограничения на две таблицы, которые ссылаются друг на друга. (Вы можете думать об этом как о курице, которая каким-то образом родилась из собственного яйца.)
Для практического примера, если у вас была система с несколькими вариантами ответов, с таблицами " question " и " ответ " ;, где question.correct_answer ссылается на answer.id, а answer.question ссылается на question.id, возможно ли добавить вопрос и его ответы одновременно?
(Кстати, я знаю, что вы можете сделать отключение и повторное включение в блоке транзакции, и что другое решение состоит в том, чтобы не иметь столбец correct_answer, а вместо этого иметь answer.correct в качестве логического значения и иметь проверьте ограничение, чтобы убедиться, что на каждый вопрос есть только один правильный ответ. Но мне не интересно, какие здесь альтернативные решения.)
Решение
Я думаю, что вы ответили на свой вопрос - вы должны сделать транзакцию блокировать. В PostgreSQL это должно работать:
BEGIN;
SET CONSTRAINTS ALL DEFERRED;
INSERT INTO questions (questionid, answerid, question)
VALUES (1, 100, 'How long are Abraham Lincoln\'s legs?');
INSERT INTO answers (answerid, questionid, answer)
VALUES (100, 1, 'Long enough to reach the ground.');
COMMIT;
Он должен находиться в блоке транзакции, поскольку в случае сбоя любого оператора INSERT база данных будет в недопустимом состоянии (ограничения таблицы не выполнены).
Другие советы
Я бы сделал это следующим образом:
<Ол>В простом случае одного вопроса и одного ответа целесообразно просто поместить все атрибуты в одну таблицу.