Page 1 sur 1
mysql foreign key
Posté : 13 janv. 2006, 12:18
par Invité
Bonjour à tous,
J'aimerais savoir si mysql permet de gérer les clés étrangères dans easyphp 1.8.
Posté : 13 janv. 2006, 12:47
par Cyrano
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.
Posté : 13 janv. 2006, 13:06
par donatello
je ne comprends pas ce que tu veux dire par "gérées par le développeur"?
Re: mysql foreign key
Posté : 13 janv. 2006, 13:13
par Cyrano
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.
Posté : 13 janv. 2006, 13:44
par donatello
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!
Posté : 13 janv. 2006, 13:46
par Cyrano
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 ?
Posté : 13 janv. 2006, 14:51
par donatello
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?
Posté : 13 janv. 2006, 15:22
par Cyrano
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.
Posté : 13 janv. 2006, 16:50
par donatello
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?
Posté : 13 janv. 2006, 17:10
par donatello
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?
Posté : 13 janv. 2006, 17:56
par donatello
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?
Posté : 13 janv. 2006, 18:59
par donatello
bon finalement j'utilise SQL yog pour gérer mes FK et ça marche sans pb. merci!
Posté : 13 janv. 2006, 20:37
par Cyrano
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;
Posté : 13 janv. 2006, 20:42
par Invité
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!
Posté : 13 janv. 2006, 20:43
par Cyrano
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