Je n'ai jamais de code de création d'objet "codé à la main" pour SQL Server et le traitement de clé étrangère est apparemment différent entre SQL Server et Postgres. Voici mon sql jusqu'à présent:
drop table exams;
drop table question_bank;
drop table anwser_bank;
create table exams
(
exam_id uniqueidentifier primary key,
exam_name varchar(50),
);
create table question_bank
(
question_id uniqueidentifier primary key,
question_exam_id uniqueidentifier not null,
question_text varchar(1024) not null,
question_point_value decimal,
constraint question_exam_id foreign key references exams(exam_id)
);
create table anwser_bank
(
anwser_id uniqueidentifier primary key,
anwser_question_id uniqueidentifier,
anwser_text varchar(1024),
anwser_is_correct bit
);
Lorsque j'exécute la requête, j'obtiens cette erreur:
Msg 8139, niveau 16, état 0, ligne 9 Le nombre de colonnes de référence dans la clé étrangère diffère du nombre de colonnes référencées, table 'banque_questions'.
Pouvez-vous repérer l'erreur?
sql
sql-server
tsql
mmattax
la source
la source
Réponses:
la source
Et si vous voulez simplement créer la contrainte seule, vous pouvez utiliser ALTER TABLE
Je ne recommanderais pas la syntaxe mentionnée par Sara Chipps pour la création en ligne, juste parce que je préfère nommer mes propres contraintes.
la source
Vous pouvez également nommer votre contrainte de clé étrangère en utilisant:
la source
J'aime la réponse d'AlexCuse, mais une chose à laquelle vous devez faire attention chaque fois que vous ajoutez une contrainte de clé étrangère est de savoir comment vous souhaitez que les mises à jour de la colonne référencée dans une ligne de la table référencée soient traitées, et surtout comment vous souhaitez supprimer les lignes dans la référence table à traiter.
Si une contrainte est créée comme ceci:
.. puis les mises à jour ou les suppressions dans la table référencée exploseront avec une erreur s'il y a une ligne correspondante dans la table référencée.
C'est peut-être le comportement que vous voulez, mais d'après mon expérience, ce n'est généralement pas le cas.
Si vous le créez à la place comme ceci:
..alors les mises à jour et suppressions dans la table parent entraîneront des mises à jour et des suppressions des lignes correspondantes dans la table de référence.
(Je ne suggère pas que la valeur par défaut devrait être modifiée, la valeur par défaut est de la prudence, ce qui est bien. Je dis simplement que c'est quelque chose qu'une personne qui crée des contraintes doit toujours faire attention .)
Cela peut être fait, en passant, lors de la création d'une table, comme ceci:
la source
- Cela fonctionnera aussi. Peut-être une construction un peu plus intuitive?
la source
Pour créer une clé étrangère sur n'importe quelle table
la source
Si vous souhaitez créer deux colonnes de table dans une relation à l'aide d'une requête, essayez ce qui suit:
la source
Comme vous, je ne crée généralement pas de clés étrangères à la main, mais si pour une raison quelconque j'ai besoin du script, je le crée généralement à l'aide de ms sql server management studio et avant d'enregistrer puis de modifier, je sélectionne Table Designer | Générer un script de changement
la source
Ce script concerne la création de tables avec une clé étrangère et j'ai ajouté la contrainte d'intégrité référentielle sql-server .
la source
Nécromancement.
En fait, le faire correctement est un peu plus délicat.
Vous devez d'abord vérifier si la clé primaire existe pour la colonne à laquelle vous souhaitez définir votre clé étrangère comme référence.
Dans cet exemple, une clé étrangère sur la table T_ZO_SYS_Language_Forms est créée, référençant dbo.T_SYS_Language_Forms.LANG_UID
la source
J'utilise toujours cette syntaxe pour créer la contrainte de clé étrangère entre 2 tables
c'est à dire
la source