2010-06-04 3 views
12

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

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) 
+0

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

+0

@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. –

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.

+0

Est-ce que cela peut être fait avec phyMyAdmin? – Joshua

+0

Oui, vous pouvez le faire dans phpMyAdmin. – Blaise

Questions connexes