0

Je les tableaux suivants:PostgresSQL étrangères clés et tables pour enfants

--Competition tables 
CREATE TABLE IF NOT EXISTS Tr.Competitions(
    competition_id  SERIAL PRIMARY KEY, 
    competition_name text NOT NULL 
); 

CREATE TABLE IF NOT EXISTS Tr.CompetitionsQuestions(
    competition_id  int NOT NULL, 
    question_id   int NOT NULL, 
    FOREIGN KEY (competition_id) REFERENCES Tr.Competitions(competition_id), 
    FOREIGN KEY (question_id) REFERENCES Tr.Questions(question_id) 
); 

--Questions tables 
CREATE TABLE IF NOT EXISTS Tr.Questions(
    question_id   SERIAL PRIMARY KEY, 
    question_text  text NOT NULL 
); 

CREATE TABLE IF NOT EXISTS Tr.MultiQuestions(
    possible_answers text ARRAY NOT NULL, 
    correct_answer  int NOT NULL 
) INHERITS(Tr.Questions); 

je tente d'insérer des données fictives dans Tr.CompetitionQuestions comme ceci:

--Test Fixtures 
INSERT INTO Tr.MultiQuestions (question_text, possible_answers, correct_answer) 
    VALUES ('Which of the following is awesome?', '{"Indian Food","Soccer","All the above"}', 2); 

INSERT INTO Tr.Competitions(competition_name) 
    VALUES ('Awesome Competition'); 

INSERT INTO Tr.CompetitionsQuestions(competition_id, question_id) 
    VALUES ((SELECT competition_id FROM Tr.Competitions WHERE competition_id=1), 
      (SELECT question_id FROM Tr.Questions WHERE question_id=1)); 

Ayant ces stockées dans un .sql fichier et en cours d'exécution \i some.sql est gerenating l'erreur suivante. Comment ajouter une clé étrangère à la table CompetitionsQuestions?

ERROR: insert or update on table "competitionsquestions" violates foreign key constraint "competitionsquestions_question_id_fkey"  
DETAIL: Key (question_id)=(1) is not present in table "questions". 

apparaît comme une erreur bizarre puisque SELECT * FROM tr.questions WHERE question_id=1 me donne en fait la ligne de multiquestion stockée.

EDIT:

simplificatrices:

INSERT INTO Tr.CompetitionsQuestions(competition_id, question_id) 
    VALUES (1, 1); 

me donne la même erreur;

+0

Où insérez-vous dans 'Tr.Questions'? – FuzzyTree

+0

Je l'insère dans 'Tr.MultiQuestions' qui hérite de' Tr.Questions'. Il y a d'autres types de questions (non montrés) comme 'Tr.TrueFalse'' Tr.ShortAnswer' qui héritent également de 'Tr.Questions' – moesef

+0

Mon intention était de permettre l'utilisation de n'importe quel type de Question comme FK dans le tableau CompetitionsQuestions – moesef

Répondre

1

(En supposant, des commentaires, que vous utilisez les fonctions d'héritage de table de PostgreSQL, puisque votre question ne contient pas vraiment plein d'informations sur le schéma et la façon dont vous remplissez son contenu):

clés étrangères ne le font pas s'applique à tous les membres d'un arbre d'héritage. Ils ne peuvent être qu'au tableau spécifique. Il en va de même pour une contrainte UNIQUE ou PRIMARY KEY.

Vous pouvez voir ce qu'est une contrainte de clé étrangère verra dans une table si vous:

SELECT * FROM ONLY thetable; 

Le mot-clé ONLY dit PostgreSQL de ne pas inclure les tables enfants. C'est ce qui est utilisé dans les vérifications de contraintes de clés étrangères.