Bonjour à tous,
Je développe un logiciel libre destiné à l'analyse d'une base de donnée. Pour le moment, le logiciel génère des représentations graphiques "propres" (optimisation du placement des tables pour limiter les croisements entre les relations) du modèle de donnée. Le niveau de détail des représentations est réglable (vue d'ensemble, représentation détaillée, représentation très détaillée).
Je m'attaque maintenant à certaines fonctionnalités qui me posent des problèmes. Je réalise que mes connaissances sur les bases de données ne sont pas très poussées, malgré le fait que je les utilise depuis plus de 10 ans.
Note : Je tiens à préciser que j'utilise uniquement MySql. Mais le logiciel que je développe est prévu pour s'adapter à toutes les bases. Pour information, il utilise l'API unifiée offerte par JDBC pour l'extraction des informations sur la structure de la base (méta données). Et il est possible de surcharger certaines fonctionnalités pour s'adapter à d'éventuelles particularités.
Ma question est la suivante :
Sous MySql, il semble qu'une clé étrangère ne peut pointer que vers une clé primaire.
Pour fixer les idées, voici un exemple valide de déclaration de clé étrangère.
tableA.fkb pointe vers la clé primaire tableB.id.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 DROP TABLE IF EXISTS tableB; CREATE TABLE tableB ( id INT NOT NULL, otherField INT NOT NULL, PRIMARY KEY(id)) ENGINE=INNODB; DROP TABLE IF EXISTS tableA; CREATE TABLE tableA ( id INT NOT NULL, fkb INT, FOREIGN KEY (fkb) REFERENCES tableB(id), PRIMARY KEY(id)) ENGINE=INNODB;
Et voici un exemple non valide :
tableA.fkb pointe vers un champ qui n'est pas une clé primaire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 DROP TABLE IF EXISTS tableB; CREATE TABLE tableB ( id INT NOT NULL, otherField INT NOT NULL, PRIMARY KEY(id)) ENGINE=INNODB; DROP TABLE IF EXISTS tableA; CREATE TABLE tableA ( id INT NOT NULL, fkb INT, FOREIGN KEY (fkb) REFERENCES tableB(otherField), PRIMARY KEY(id)) ENGINE=INNODB;
Cette règle est-elle valable pour tous les SGBD?
Merci,
Laurent
Partager