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

Меня в первую очередь интересует pgsql, но мне было интересно, есть ли способ в какой-либо СУБД выполнить операцию вставки, без отключения и повторного включения любых ограничений FOREIGN KEY или NOT NULL на двух таблицах, которые ссылаются друг на друга. (Вы можете думать об этом как о курице, которая каким-то образом родилась из собственного яйца.)

Для практического примера, если у вас была система тестов с несколькими вариантами ответов, с таблицами «question» и «answer», где question.correct_answer ссылается на answer.id, а answer.question ссылается на question.id, можно добавить вопрос и его ответы одновременно?

(Кстати, я знаю, что вы можете сделать отключение и повторное включение в блоке транзакции, и что другое решение состоит в том, чтобы не иметь столбец correct_answer, а вместо этого иметь answer.correct в качестве логического значения и иметь проверьте ограничение и убедитесь, что на каждый вопрос есть только один правильный ответ. Но мне не интересно, какие здесь альтернативные решения.)

Ответы [ 3 ]

4 голосов
/ 07 октября 2008

Я думаю, что вы ответили на свой вопрос - вы должны сделать блокировку транзакции. В 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 база данных будет в недопустимом состоянии (ограничения таблицы не выполнены).

0 голосов
/ 29 октября 2008

В простом случае одного вопроса и одного ответа целесообразно просто поместить все атрибуты в одну таблицу.

0 голосов
/ 07 октября 2008

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

  1. Определите Questions.correct_answer как Обнуляемый столбец.
  2. Вставить строку в Вопросы, с параметром correct_answer, установленным на NULL.
  3. Вставьте строку (и) в Ответы, ссылаясь на строку в Вопросах.
  4. ОБНОВЛЕНИЕ Вопросы УСТАНОВИТЬ correct_answer =?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...