Frage

Ich bin in erster Linie daran interessiert, pgsql für diese, aber ich frage mich, ob es eine Möglichkeit, in jedem RDBMS ist eine Insert Operation zu tun, ohne zu deaktivieren und erneut aktiviert jede FOREIGN KEY oder NOT NULL Einschränkungen auf zwei Tabellen, die sich aufeinander beziehen. (Sie könnte als ein Huhn daran denken, die irgendwie aus dem eigenen Ei geboren wurde.)

Ein praktisches Beispiel, wenn Sie ein Multiple-Choice-Quiz-System haben, mit Tabellen „Frage“ und „Antwort“, wo question.correct_answer auf answer.id bezieht und answer.question auf question.id bezieht, ist es möglich, eine Frage und ihre Antworten gleichzeitig?

hinzufügen

(Für das Protokoll, ich bin mir dessen bewusst, dass Sie die Sperrung tun können, und die erneute Aktivierung in einem Transaktionsblock, und dass eine andere Lösung ist nicht eine correct_answer Spalte haben, sondern answer.correct als boolean haben und haben ein überprüfen Einschränkung dafür, dass es genau eine richtige Antwort pro Frage. Aber ich bin nicht neugierig auf alternative Lösungen hier.)

War es hilfreich?

Lösung

Ich denke, dass Sie Ihre eigene Frage beantwortet - Sie einen Transaktionsblock zu machen. In PostgreSQL sollte diese Arbeit:

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;

Es hat in einem Transaktionsblock sein, weil, wenn eine INSERT-Anweisung die Datenbank ist fehlgeschlagen in einem ungültigen Zustand wäre (Tabellenbedingungen nicht erfüllt werden).

Andere Tipps

ich es in der folgenden Art und Weise tun würde:

  1. definieren Questions.correct_answer als Nullable-Spalte.
  2. Zeile einfügen in Fragen, mit correct_answer auf NULL gesetzt.
  3. Einfügen Zeile (n) in Antworten, Verweis auf die Zeile in Fragen.
  4. UPDATE Fragen SET correct_answer =?

Im einfachen Fall einer Frage und eine Antwort ist es ratsam, nur alle Attribute in eine Tabelle zu setzen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top