2 votes

Puis-je créer une clé étrangère pour une table avec des éléments qui n'existent pas dans la table référencée ?

Je travaille sur une mission qui me demande d'écrire des contraintes d'intégrité référentielle sur une table. Il me demande de m'assurer que chaque bataille dans Outcomes est également mentionnée dans Battles et de traiter toutes les violations en mettant la valeur de référence à NULL.

Je travaille avec les schémas suivants

Battles(
    name VARCHAR(255) PRIMARY KEY, 
    date VARCHAR(255), 
)
Outcomes(
    ship VARCHAR(255),
    battle VARCHAR(255),
    RESULT VARCAHR(255),
    PRIMARY KEY(ship, battle)
)

J'essaie d'ajouter la clé étrangère comme ceci :

alter table outcomes 
add foreign key (battle) 
references battles(name) 
on delete set null 
on update cascade;

Je reçois l'erreur suivante :

SQL error:

ERROR:  insert or update on table "outcomes" violates foreign key constraint "outcomes_battle_fkey"
DETAIL:  Key (battle)=(Pearl Harbor 

Je sais que c'est parce que "Pearl Harbor" est dans OUTCOMES mais pas dans BATTLES. Ce que je veux savoir, c'est s'il existe un moyen d'ignorer ce fait et de définir la clé étrangère de toute façon ?

3voto

Branko Dimitrijevic Points 28493

et de traiter toutes les violations en mettant la valeur de référencement à NULL.

C'est impossible, puisque battle fait partie de la Outcomes Il ne peut donc pas être NULL. Votre modèle de données n'est tout simplement pas construit pour gérer un résultat "sans bataille".


Si vous deviez changer votre modèle et supprimer le battle de la table enfant PK, alors vous pourriez "réparer" les données en :

UPDATE Outcomes SET battle = NULL
WHERE battle NOT IN (SELECT battle FROM Battles)

À ce stade, vous pourriez créer le FK sans provoquer de violation (les FK ne sont appliqués qu'aux champs non NULL).

1voto

Tomek Points 2163

Vous devez chercher une option qui empêche la vérification au moment de la création de la clé, pour Sql Server ce serait WITH NOCHECK il :

Indique si les données de la table sont ou non validées par rapport à la norme de l'UE. une contrainte FOREIGN KEY ou CHECK nouvellement ajoutée ou réactivée. Si aucune spécifié, WITH CHECK est supposé pour les nouvelles contraintes, et WITH NOCHECK pour les contraintes réactivées.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X