Question

Je suis principalement intéressé par pgsql pour cela, mais je me demandais s'il existe un moyen dans un SGBDR de faire une opération d'insertion, sans désactiver ni réactiver les clés FOREIGN KEY ou NOT NULL. contraintes, sur deux tables qui se réfèrent. (Vous pouvez penser à cela comme à une poule née de son propre œuf.)

Pour un exemple pratique, si vous disposiez d'un système de quiz à choix multiples, utilisez des tableaux "question". et "answer", où question.correct_answer fait référence à answer.id et answer.question à question.id, est-il possible d’ajouter une question et ses réponses simultanément?

(Pour rappel, je suis conscient du fait que vous pouvez désactiver et réactiver un bloc de transaction, et qu'une autre solution consiste à ne pas avoir de colonne correct_answer mais plutôt à answer.orrect en tant que booléen et vérifiez la contrainte en vous assurant qu'il y a exactement une bonne réponse par question, mais je ne suis pas curieux de voir les solutions alternatives ici.)

Était-ce utile?

La solution

Je pense que vous avez répondu à votre propre question: vous devez créer un bloc de transaction. Dans PostgreSQL, cela devrait fonctionner:

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;

Il doit être dans un bloc de transaction, car si l'une des instructions INSERT échouait, la base de données se trouverait dans un état non valide (contraintes de table non respectées).

Autres conseils

Je le ferais de la manière suivante:

  1. Définissez Questions.correct_answer en tant que colonne nullable.
  2. Insérer une ligne dans les questions, avec correct_answer défini sur NULL.
  3. Insérez une ou plusieurs lignes dans les réponses en faisant référence à la ligne dans les questions.
  4. UPDATE Questions SET correct_answer =?

Dans le cas simple d'une question et d'une réponse, il est conseillé de ne mettre que tous les attributs dans un tableau.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top