mysql foreign key

Invité
Invité n'ayant pas de compte PHPfrance

13 janv. 2006, 12:18

Bonjour à tous,
J'aimerais savoir si mysql permet de gérer les clés étrangères dans easyphp 1.8.

Mammouth du PHP | 19672 Messages

13 janv. 2006, 12:47

Les clés étrangères ne sont pas gérées par MySQL mais pas le développeur. Ce que MySQL, c'est éventuellement l'intégrité référentielle. Mais ceci n'est valable qu'avec des tables de type InnoDB. L'intégrité référentielle n'est pas supportée avec des tables de type MyISAM.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 171 Messages

13 janv. 2006, 13:06

je ne comprends pas ce que tu veux dire par "gérées par le développeur"?

Mammouth du PHP | 19672 Messages

13 janv. 2006, 13:13

J'aimerais savoir si mysql permet de gérer les clés étrangères dans easyphp 1.8.
Pour faire simple, ta question n'a pas de sens, j'ai donc interprété, peut-être de travers : donc, qu'est-ce que tu entends par "gérer les clés étrangères" ?

J'ajoute que la version de EasyPHP est sans intérêt, ce qui est important en l'occurence, c'est la version de MySQL. EasyPHP comprend une version de MySQL, mais EasyPHP n'est qu'un ensemble qui regroupe différents éléments d'un environnement de développement, en soi, ça ne fait strictement rien de façon autonome.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 171 Messages

13 janv. 2006, 13:44

oui, je me suis mal exprimé effectivement.
J'ai la version 4.1.9 et a priori pas de pb pour les cles etrangeres si je passe en InnoDB. Merci!

Mammouth du PHP | 19672 Messages

13 janv. 2006, 13:46

Donc je n'avais pas si mal interprété en parlant "d'intégrité référentielle" ? C'est bien de ça que tu voulais parler ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 171 Messages

13 janv. 2006, 14:51

donc je suis en inno db sur mysql.
petite question:

J'ai 2 tables A et B.
Id est la clé primaire de A, et je veux en faire une clé étrangère dans B.

Pour réaliser ça j'ai fait les opérations suivantes dans phpmyadmin:
1- Je mets Id en cle primaire dans B
2- Je vais dans gestion des relations de B
3- Je pointe sur la cle primaire de A dans la liste de selection
4- Pour ON DELETE, je selectionne cascade

Après validation, j'ai l'erreur: "Aucune clef definie (Id) "

Voyez vous ce qui ne va pas?

Mammouth du PHP | 19672 Messages

13 janv. 2006, 15:22

Bon, tu ne saisis donc pas bien le principe des clés étrangères/clés primaires.

Dans ta table A, tu as défini une clé primaire. Pour la définir en clé étrangère dans la table B, il faut ajouter un champ dans la table B indépendament de la clé primaire de la table B.

Une clé primaire pointe sur une ligne de la table où elle est définie, jamais sur autre chose. Prenons un exemple :

Code : Tout sélectionner

+-------------------------+ | table_A | +------+-------------+----+ | a_id | INT | PK | |champ1| VARCHAR(32) | | +------+-------------+----+ +-------------------------+ | table_B | +------+-------------+----+ | b_id | INT | PK | | a_id | INT | FK | |champ1| VARCHAR(32) | | +------+-------------+----+
J'ai ici deux tables. Chacune a sa propre clé primaire que j'ai préfixé : Les champs identifiés PK (Primary Key)

La table B a en outre un champ supplémentaire identifié FK (ne le cherche pas dans MySQL) : il faut ajouter ce champ, lui donner de préférence le même nom que le nom d'origine de la table où il est la clé primaire. Il faut également que ce champ soit du même type.

À partir de là, en gérant tes relations, tu vas pointer d'un coté dans la table A sur a_id et de l'autre coté dans la table B sur a_id : le lien d'intégrité référentielle va se faire sur cette base.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 171 Messages

13 janv. 2006, 16:50

ok, ton explication est super claire, ça m'aide beaucoup!
J'ai suivi tes instructions et je bute sur la dernière étape.
Je récapitule, juste parceque ça m'aide à y voir clair.

1- j'ai mis a_id en clé PK dans A
2- j'ai mis b id en PK dans B
3- J'ai ajouté un champs a_id dans B, en faisant attention au type

Gestion des relations:
1- Pour A, je pointe sur a_id et je valide, ça marche sans pb
2- pour B je rencontre un pb:
L'interface gestion des relations me propose une liaison de b_id avec a_id, rien d'autre. et quand je valide, j'ai toujours le message "Clef non definie".

Si j'ai bien compris, dans B, je devrais pouvoir lier a_id et pas b_id comme c'est le cas non?

Eléphant du PHP | 171 Messages

13 janv. 2006, 17:10

Complément d'info, je n'ai plus d'erreur quand je fais ceci:
+-------------------------+
| table_A |
+------+-------------+----+
| a_id | INT | PK |
|champ1| VARCHAR(32) | |
+------+-------------+----+

+-------------------------+
| table_B |
+------+-------------+----+
| a_id | INT | PK |
| a_id | INT | FK |
|champ1| VARCHAR(32) | |
+------+-------------+----+
où a_id est à la fois PK et FK dans B...qu'en penses tu?

Eléphant du PHP | 171 Messages

13 janv. 2006, 17:56

ok, je crois avoir trouvé mon pb:
la création de clef etrangere a_id dans B ne marchait pas parcequ'il faut définir a_id comme UNIQUE dans B avant de faire une liaison avec a_id dans A.
Tu confirmes?

Eléphant du PHP | 171 Messages

13 janv. 2006, 18:59

bon finalement j'utilise SQL yog pour gérer mes FK et ça marche sans pb. merci!

Mammouth du PHP | 19672 Messages

13 janv. 2006, 20:37

Bon, script de création de mes deux tables exemple :

Code : Tout sélectionner

-- phpMyAdmin SQL Dump -- version 2.6.2 -- http://www.phpmyadmin.net -- -- Serveur: localhost -- Généré le : Vendredi 13 Janvier 2006 à 19:35 -- Version du serveur: 4.1.13 -- Version de PHP: 5.0.5 -- -- Base de données: `test` -- -- -------------------------------------------------------- -- -- Structure de la table `table_a` -- CREATE TABLE `table_a` ( `a_id` int(11) NOT NULL auto_increment, `champ_1` varchar(32) binary NOT NULL default '', PRIMARY KEY (`a_id`) ) TYPE=InnoDB; -- -------------------------------------------------------- -- -- Structure de la table `table_b` -- CREATE TABLE `table_b` ( `b_id` int(11) NOT NULL auto_increment, `a_id` int(11) NOT NULL default '0', `champ_1` varchar(32) binary NOT NULL default '', PRIMARY KEY (`b_id`), KEY `a_id` (`a_id`) ) TYPE=InnoDB; -- -- Contraintes pour la table `table_b` -- ALTER TABLE `table_b` ADD CONSTRAINT `table_b_ibfk_1` FOREIGN KEY (`a_id`) REFERENCES `table_a` (`a_id`) ON DELETE CASCADE ON UPDATE CASCADE;
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Invité
Invité n'ayant pas de compte PHPfrance

13 janv. 2006, 20:42

ok, ça marche nickel. Mais il y a un truc qui m'échappe ou alors phpmyadmin a un pb avec la création de clés étrangères par l'interface.
En tout cas je peux continuer à bosser. merci!

Mammouth du PHP | 19672 Messages

13 janv. 2006, 20:43

Avais-tu indexé le champ a_id dasns la table_B ?

D'autre part, la gestion des relation se fait ici depuis la table_B et non depuis la table_A
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: