Faire un don ! | | style | statistiques | contactez-nous | plan | lettre d'information

Journal : Gérer les clés étrangère avec Mysql

Posté par Philippe (page perso, ) le 18 juillet 2005
Depuis peut Mysql est capable de gérer les contraintes de clés étrangères[1]. Une fonction qui évite la gestion des correspondance par du code (php, c...).
Imaginons deux tables, familles et professions. Nous avons comme contraintes qu'une famille peut avoir plusieurs professions et qu'une professions peut avoir plusieurs famille, ce qui donne des cardinalitées 1,N de chaque côté. Pour ceux qui ont suivit les cours de développement pendant leurs BTS ;-) lorsque vous allez réaliser le MCD vous aurez deux entités (familles, professions) et une associations (prof_fam) qui va contenir les clés primaires des entités familles et professions. Voila pour la partie théorique.

Maintenant le code sql :

CREATE TABLE familles (
nom_fam VARCHAR(3) NOT NULL PRIMARY KEY,
designation VARCHAR(30) NULL,
code VARCHAR(3) NULL
) TYPE = InnoDB;

CREATE TABLE professions (
nom_prof VARCHAR(10) NOT NULL PRIMARY KEY
) TYPE = InnoDB;

CREATE TABLE prof_fam (
nom_fam VARCHAR(3) NOT NULL,
nom_prof VARCHAR(10) NOT NULL,
PRIMARY KEY(nom_fam,nom_prof),
FOREIGN KEY(nom_fam) REFERENCES familles(nom_fam) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY(nom_prof) REFERENCES professions(nom_prof) ON DELETE CASCADE ON UPDATE CASCADE,
INDEX(nom_fam),
INDEX(nom_prof)
) TYPE = InnoDB;


Attention l'ordre de création est important, d'abord les entités qui ne comporte pas de clés étrangères, ensuite les associations. Vous remarquez qu'il faut utiliser le format InnoDB[2]. Les lignes qui nous intéresses sont les FOREIGN KEY, c'est grâce à cette commande que nous indiquons à Mysql avec quelle entités les données présentes dans prof_fam sont liées. Pour plus d'informations sur la syntaxe aller faire un tour dans la documentation de mysql[3].

Le code PHP. Maintenant que nos tables sont créés nous pouvons les remplir, vous avez le choix, à la main ou alors grâce à des imports. J'ai choisi la deuxième option. Je ne vous donnerais pas le code complet, ce n'est pas le but de cette article mais juste la partie qui concerne l'erreur "a foreign key constraint fails" généré lorsque vous essayé de remplir en masse la table prof_fam. Il existe une commande SQL pour désactiver temporairement la gestion des clés étrangères : SET FOREIGN_KEY_CHECKS = 0

Le code PHP en question :

// Suppression temporaire de la gestion des clés étrangères
connecte();
$req = "SET FOREIGN_KEY_CHECKS = 0";
$result = mysql_query($req) or die('Erreur SQL !'.$sql.''.mysql_error());
foreach($columns_profam as $cle => $val)
{
$req = "INSERT INTO prof_fam(nom_fam, nom_prof) VALUES('$nom_fam', '$num_prof')";
$result = mysql_query($req) or die('Erreur SQL !'.$sql.''.mysql_error());
}

// activation de la gestion des clés étrangères.
$req = "SET FOREIGN_KEY_CHECKS = 1";
$result = mysql_query($req) or die('Erreur SQL !'.$sql.''.mysql_error());



[1] http://www.nexen.net/docs/mysql/annotee/innodb-foreign-key-constrai(...)
[2] http://www.innodb.com/index.php(...)
[3] http://www.nexen.net/docs/mysql/annotee/innodb.php(...)

> Lire le journal (22 commentaires, moyenne: 2,1).  

Vous avez demandé le commentaire #602089.

Depuis peu ?

Posté par EppO (page perso, ) le 18/07/2005 à 13:42. (lien). Évalué à 3.

Depuis peut Mysql est capable de gérer les contraintes de clés étrangères

Ca fait un bail, comme indiqué sur le site de mysql (http://dev.mysql.com/doc/mysql/en/innodb-foreign-key-constraints.ht(...) ), c'est depuis la 3.23.44 qui date du 02/11/2001
Mais le format de table par défaut était MyISAM à l'époque, et le support innoDB désactivé par défaut.

  • [^]Re: Depuis peu ?

    Posté par Philippe (page perso, ) le 18/07/2005 à 13:57. (lien). Évalué à 1.

    Ha autant pour moi alors.

    --
    ---
    http://flipflip.ovh.org