2017-09-05 2 views
0

J'ai des difficultés à ajouter une contrainte avec deux conditions de contrainte à une table déjà existante. Je travaille avec les deux relations ci-dessous, et j'essaie d'ajouter la contrainte à la table "books".PostgreSQL: Ajouter une contrainte avec des conditions multiples

Les relations sont:

  1. livres ((book_id), titre, AUTHOR_ID, id_sujet)

  2. sujets ((id_sujet), sous réserve, emplacement)

Où les clés dans les parenthèses sont des clés primaires, et les italiques sont des clés étrangères.

Le premier critère/condition est que le id_sujet est NOT NULL, et que le id_sujet lors de l'insertion d'un nouveau tuple livre dans les livres, a déjà exister en tant que clé primaire dans la relation des sujets.

ALTER TABLE books ADD CONSTRAINT hasSubject 
    CHECK(subject_id IS NOT NULL AND subject_id REFERENCES subjects(subject_id)) 

Je reçois le message d'erreur: "erreur de syntaxe à ou près de 'Références'"

Toutes les idées? Merci d'avance!

Répondre

1

REFERENCES est un type de contrainte distinct. Donc, vous avez besoin de deux contraintes:

ALTER TABLE books ADD CONSTRAINT chk_books_subject_id 
    CHECK (subject_id IS NOT NULL); 

ALTER TABLE books ADD CONSTRAINT fk_books_subject_id 
    FOREIGN KEY (subject_id) REFERENCES subjects(subject_id); 

Je mets ces deux ALTER TABLE déclarations, de souligner qu'ils sont différents. Ils peuvent être combinés en une seule déclaration.

EDIT:

Dans une déclaration:

ALTER TABLE books 
    ADD CONSTRAINT chk_books_subject_id CHECK (subject_id IS NOT NULL), 
    ADD CONSTRAINT fk_books_subject_id FOREIGN KEY (subject_id) REFERENCES subjects(subject_id); 
+0

Merci! Souhaitez-vous montrer comment combiner ces deux contraintes? J'ai essayé de combiner les deux avec une déclaration "ET". Donc: "... N'EST PAS NULL" ET FOREIGN KEY (subject_id) ... ", mais a reçu un message d'erreur de syntaxe se plaignant" at or near "AND". – Ninu

+0

Encore une fois, merci !! :) Serait-il possible pour joindre les deux contraintes et y faire référence avec un nom commun "hasSubjects" En d'autres termes, est-il possible de réécrire cette seule instruction avec un seul terme "ADD CONSTRAINT" tout en gardant la même fonctionnalité? – Ninu

+0

@Ninu. Non, ce n'est pas possible, il y a deux contraintes. –