Clé étrangère

Fermé
jeff - 16 avril 2008 à 01:26
 Jeff - 19 avril 2008 à 10:22
Bonjour à tous,

voilà, je vais déjà vous énoncer tout ça ^^ ...Je suis actuellement en train de me lancer dans un site web plus dynamique que l'actuel en y incorporant du PHP et l'associer au SQL histoire de me faciliter la vie.
J'ai donc commencé à élaborer un croquis de ma base de donnée, tout est encore à faire (pratiquement).
Mon premier objectif étant de proposer à mes participants une fiche de leur équipe comme ci dessous :

http://jeffletourdi.free.fr/FCA.PNG

J'ai donc créé quelques tables comme voici :


CREATE TABLE Defifoot (
intitulechamp varchar(100) not null,
lien_champ text not null,
PRIMARY KEY (intitulechamp)
);

CREATE TABLE Liens (
id integer auto_increment not null,
lien_equipe varchar(70) not null,
lien_manager varchar(70) not null,
PRIMARY KEY (id),
FOREIGN KEY (id) REFERENCES Participants (id)
);

CREATE TABLE Participants (
id integer auto_increment not null,
nom_equipe varchar(25) not null,
nom_manager varchar(25) not null,
stade varchar(70) not null,
fondation text not null,
forme text,
lien_equipe varchar(70) not null,
lien_manager varchar(70) not null,
situation_defifoot varchar(100) not null,
classement_champ varchar(20),
groupe_champ varchar(20),
classement_coupe varchar(20),
groupe_coupe varchar(20),
id_coupe varchar(40) not null,
PRIMARY KEY (id),
FOREIGN KEY (lien_equipe) REFERENCES Liens (lien_equipe),
FOREIGN KEY (lien_manager) REFERENCES Liens (lien_manager),
FOREIGN KEY (classement_champ) REFERENCES Championnat (classement),
FOREIGN KEY (groupe_champ) REFERENCES Championnat (groupe),
FOREIGN KEY (classement_coupe) REFERENCES Coupes (classement),
FOREIGN KEY (groupe_coupe) REFERENCES Coupes (groupe),
FOREIGN KEY (id_coupe) REFERENCES Coupes (id),
FOREIGN KEY (situation_defifoot) REFERENCES Defifoot (intitulechamp)
);

CREATE TABLE Coupes (
id_coupe varchar(40) not null,
id_participants integer auto_increment not null,
groupe varchar(20),
NbrM integer,
Points integer,
Victoires integer,
Nul integer,
Defaites integer,
BP integer,
BC integer,
DIFF integer,
classement varchar(20),
PRIMARY KEY (id_coupe, id_participants),
CONSTRAINT pk_idp FOREIGN KEY (id_participants) REFERENCES Participants (id)
);

CREATE TABLE Championnat (
id_participants integer auto_increment not null,
groupe varchar(20),
NbrM integer,
Points integer,
Victoires integer,
Nul integer,
Defaites integer,
BP integer,
BC integer,
DIFF integer,
classement varchar(20),
PRIMARY KEY (id_participants),
FOREIGN KEY (id_participants) REFERENCES Participants (id)
);


PROBLEME : lorsque je renseigne par exemple la clé primaire intitulechamp de la table defifoot, cela n'a aucun effet sur la clé étrangère de la table participants.
Ceci n'est qu'un exemple bien sur, cela s'applique à toutes mes clés étrangères.

Alors est-ce une mauvaise organisation de ma base de donnée? Ou autre chose, merci de me venir en aide :D

Amicalement, jeff
A voir également:

2 réponses

Utilisateur anonyme
16 avril 2008 à 10:36
Une clé étrangère signifie qu'il faut que la valeur existe dans la table principale pour effectuer l'insertion. C'est donc lorsque tu vas insérer dans la table participants qu'il va y avoir une vérification de faite.

En plus clair :
INSERT INTO DEFIFOOT VALUES('Text', 'Text');

INSERT INTO PARTICIPANTS VALUES('id', , 'nom_equipe', 'nom_manager ', 'stade', 'fondation', 'forme', 'lien_equipe', 'lien_manager', 'Text' ....);
--> Cet Insert sera correct car 'Text' est bien une valeur qui existe dans la table DEFIFOOT.

En revanche, l'insert suivant ne fonctionnera pas :
INSERT INTO PARTICIPANTS VALUES('id', , 'nom_equipe', 'nom_manager ', 'stade', 'fondation', 'forme', 'lien_equipe', 'lien_manager', 'Bidon' ....);
--> Cet Insert te retournera un message d'erreur car la valeur 'Bidon' n'existe pas dans la table DEFIFOOT

N'hésites pas si tu as d'autres questions ou si je n'ai pas été assez clair ;-)
2
Bonjour Tassin,

je te remercie pour ta réponse. Donc si j'ai bien compris une clé étrangère sert simplement à émettre une contrainte d'intégrité référentielle, mais je dois donc manuellement mettre à jour les données des deux tables?
Parce que j'ai entendu parlé d'un "ON DELETE CASCADE ON UPDATE CASCADE" permettant lors de la mis à jour(je crois) de modifier des deux côtés la même donnée.

Je vais donc essayer suivant ta réponse de recommencer mon script etc...si j'ai des souci, je te préviens, merci beaucoup de ton aide.

Amicalement, jeff
0
Utilisateur anonyme
16 avril 2008 à 11:40
De rien pour mon aide c'est tout à fait normal ;-)

En ce qui concerne le ON DELETE CASCADE celui-ci permet effectivement de supprimer les enregistrements sur chacune des tables qui font référence à la donnée supprimée. En effet, cela sert à garder l'intégrité de tes données.

Tu dois insérer dans les 2 tables mais lors de la mise à jour ou la suppression d'un enregistrement tu ne te préoccupes pas des tables liées. (Si tu as positionné la valeur ON DELETE CASCADE ON UPDATE CASCADE)

Plus simplement :
DELETE FROM DEFIFOOT WHERE intitulechamp = 'Text';
Tous les enregistrements de la table participants qui ont comme valeur 'Text' pour le champs situation_defifoot seront également supprimés.

Alex
0
Bonjour Tassin,

ok pas de souci, merci de tes conseils, j'ai pigé la chose :D

Merci beaucoup et à bientôt !

Jeff
0