aucune correspondance entre deux tables

Eléphant du PHP | 258 Messages

10 déc. 2008, 16:00

franchement
j'ai du mal avec les clés étrangères

car je me heurte au pb de contrainte
Cannot add or update a child row: a foreign key constraint fails
je me suis renseigné auprès de Google.
je crois comprendre que quand on supprime ou ajoute, il faudrait d'abord supprimer ou ajouter dans la table fille pour pouvoir remplir ensuite la table mere..

mes tables sont l'une vides, l'autre remplies. pas évident de gérer .

donc je préfère supprimer les clés étrangères.


merci à vous
Cordialement
---------------------------------------------------------
Cyphos utilise
- Firefox et Google Chrome dernière version
- Windows Seven ou Windows XP SP3,
- Wampserver

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

10 déc. 2008, 17:30

Si tu ne veux pas que la contrainte relationnelle t'empêche de modifier ou supprimer des champs liées (clé étrangère/clé primaire) il faut autoriser les modifications et suppressions en cascade dans la définition de la relation. La solution n'est pas de remettre en cause le rôle des clés étrangères qui assurent le lien entre les tables. Si tu remets en cause un tel concept, pourquoi alors opter pour l'usage d'une base de données relationnelle.

Voici comment activer les modifications et suppressions en cascade sur une relation entre deux tables.
Je rappelle pour cela que la relation est définie dans la table qui contient la clé étrangère et qui pointe vers la clé primaire de la table liée. Voici donc comment :

Soit les 2 tables de l'exemple :
  • Table: client (id, nom) et Table: commande (numero, date, id_client)
    La clé primaire de la table client est le champ (id) et celle de la table commande est le champ (numero)
    La clé étrangère est le champ (id_client) qui se trouve dans la table commande et qui n'est que le sosie ou la copie du champ (id) de la table client.
La clé étrangère (id_client) assure donc le lien entre un client et ses commandes pour éviter de devoir renseigner toutes les information du client quand on lui crée des commandes.

Voici, le code SQL pour déclarer les tables :

Code : Tout sélectionner

Create Table client( id int not null, nom varchar(20) not null, primary key (id) ); Create Table commande ( numero int not null, date datetime not null, id_client int not null, primary key (numero) );
Voici le code SQL pour définir la relation avec modifications et suppressions en cascade:

Code : Tout sélectionner

Alter Table commande Add Constraint 'fk_commande_client' Foreign Key (id_client) References client(id) ON Update Cascade ON Delete Cascade;
Par contre, si les tables et la relation sont déjà définies, on peut modifier la relation par exemple avec le code suivant (en spécifiant Alter au lieu de Add) :

Code : Tout sélectionner

Alter Table commande Alter Constraint 'fk_commande_client' Foreign Key (id_client) References client(id) ON Update Cascade ON Delete Cascade;
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène