J'ai une table qui a une référence "clé étrangère" elle-même. Ce serait très utile, sauf que je ne sais pas comment ajouter le premier enregistrement à une telle table. Peu importe ce que j'ajoute, je ne peux pas fournir une clé "étrangère" valide à la table elle-même, n'ayant pas encore d'entrées. Peut-être que je n'y vais pas correctement, mais je veux que cette table représente quelque chose qui soit toujours un membre de lui-même. Y a-t-il un moyen de «faire du bootstrap» une telle table, ou une autre façon d'aller vers l'auto-référence?Champs de table auto-référencés dans MySQL
12
A
Répondre
12
Une option est de rendre votre champ NULL
able, et définir la clé parent du disque racine à NULL
:
CREATE TABLE tb_1 (
id int NOT NULL PRIMARY KEY,
value int NOT NULL,
parent int NULL,
FOREIGN KEY (parent) REFERENCES tb_1(id)
) ENGINE=INNODB;
Query OK, 0 rows affected (0.43 sec)
-- This fails:
INSERT INTO tb_1 VALUES (1, 1, 0);
ERROR 1452 (23000): A foreign key constraint fails.
-- This succeeds:
INSERT INTO tb_1 VALUES (1, 1, NULL);
Query OK, 1 row affected (0.08 sec)
Sinon, vous pouvez toujours utiliser une clé parente NOT NULL
et pointer vers le dossier racine lui-même:
CREATE TABLE tb_2 (
id int NOT NULL PRIMARY KEY,
value int NOT NULL,
parent int NOT NULL,
FOREIGN KEY (parent) REFERENCES tb_2(id)
) ENGINE=INNODB;
Query OK, 0 rows affected (0.43 sec)
-- This fails:
INSERT INTO tb_2 VALUES (1, 1, 0);
ERROR 1452 (23000): A foreign key constraint fails.
-- This succeeds:
INSERT INTO tb_2 VALUES (1, 1, 1);
Query OK, 1 row affected (0.08 sec)
2
Vous pouvez faire:
SET FOREIGN_KEY_CHECKS = 0;
Effectuez ensuite l'insertion, puis réglez-la sur 1 après. Comme il s'agit d'une variable de session, une déconnexion la réinitialisera et n'affectera pas les autres connexions.
Questions connexes
- 1. Trier les champs de la table mySQL
- 2. comment concevoir une table dans mysql avec deux champs auto_increment
- 3. MySQL Alter Table utilisant les valeurs de champs existantes
- 4. Trier plusieurs champs dans MySQL
- 5. mysql sélectionner dans plusieurs champs
- 6. mysql concat tous les champs de la table
- 7. Indexer une table mysql de 3 champs entiers
- 8. Une table mysql avec de nombreux champs ou plusieurs (centaines de) tables avec moins de champs?
- 9. Comment importer les champs sélectionnés dans mysql
- 10. MYSQL Trouver les données dans une table basée sur l'un des deux champs d'une autre table
- 11. champs de plage de groupe dans mysql?
- 12. Champs de la table USR02 dans SAP
- 13. Champs de compte/somme MySQL
- 14. Impossible de créer une table dans mysql
- 15. Duplication de lignes dans une table mysql sans énumération de champs
- 16. table système d'édition MySQL
- 17. PHP champs de bits mysql
- 18. Champs MySQL terminés par l'onglet
- 19. MySQL - comptent les différents champs de conditions différentes dans une table jointe
- 20. Calculer le pourcentage de champs (colonnes) utilisés dans MySQL
- 21. Comment afficher les champs d'une table dans Oracle?
- 22. mysql: comment additionner 2 champs dans la table et mettre le résultat dans le 3ème champ?
- 23. Conception MySQL avec nombre dynamique de champs
- 24. MySQL Bulk Insérer des champs de géométrie
- 25. Comment convertir les types de champs MySQL?
- 26. Recherche de champs MySQL avec des noms de champs similaires
- 27. MySQL concaténant des champs mais ignorant les champs vides
- 28. Conception de table Mysql: rôles de table
- 29. Comment faire correspondre plusieurs champs dans mySQL
- 30. Synchronisation de table MySQL
Si j'utilisais la seconde approche, (tb_2), comment pourrais-je savoir avec certitude quel numéro utiliser pour le troisième paramètre? – Joshua
@Joshua: Le troisième paramètre est le même que le premier paramètre (pour l'enregistrement racine). C'est-à-dire que le parent_id de l'enregistrement racine est identique à son id. Ensuite, pour les autres lignes, référencez simplement le 'parent_id' approprié normalement. –