Можно / как добавить круг ссылок, не нарушая РИ?

StackOverflow https://stackoverflow.com/questions/179582

  •  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 база данных будет в недопустимом состоянии (ограничения таблицы не выполнены).

Другие советы

Я бы сделал это следующим образом:

<Ол>
  • Определите Questions.correct_answer как Обнуляемый столбец.
  • Вставьте строку в Вопросы, указав правильное значение_свера NULL.
  • Вставьте строки в ответы, ссылаясь на строку в вопросах.
  • ОБНОВЛЕНИЕ Вопросы УСТАНОВИТЬ correct_answer =?
  • В простом случае одного вопроса и одного ответа целесообразно просто поместить все атрибуты в одну таблицу.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top