2010-06-04 34 views
12

Tengo una tabla que tiene una "clave externa" haciendo referencia a sí misma. Esto sería muy útil, excepto que no estoy seguro de cómo agregar el primer registro a dicha tabla. No importa lo que agregue, no puedo proporcionar una clave "extranjera" válida para la tabla en sí, ya que todavía no tengo entradas. Tal vez no estoy haciendo esto correctamente, pero quiero que esta tabla represente algo que siempre es un miembro de sí mismo. ¿Hay alguna manera de "arrancar" tal tabla, u otra forma de ir por la auto-referencia?Campos de tablas autorreferenciales En MySQL

Respuesta

12

Una opción es hacer que su campo NULL -able, y establecer la clave principal del registro raíz a 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) 

lo contrario, podría seguir utilizando una clave NOT NULL padres y el punto a la misma registro raíz:

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 tuviera que usar el segundo enfoque, (tb_2), ¿cómo podría saber con seguridad qué número usar para el tercer parámetro? – Joshua

+0

@Joshua: El tercer parámetro es el mismo que el primer parámetro (para el registro raíz). Es decir, el 'parent_id' del registro raíz es el mismo que su' id'. Luego, para otras filas, simplemente haga referencia al apropiado 'parent_id' normalmente. –

2

Se podría hacer:

SET FOREIGN_KEY_CHECKS = 0; 

Luego, realice la inserción y luego vuelva a establecerla en 1 después. Sin embargo, es una variable de sesión, por lo que una desconexión lo restablecerá y no afectará otras conexiones.

+0

¿Se puede hacer esto a través de phyMyAdmin? – Joshua

+0

Sí, puedes hacer esto en phpMyAdmin. – Blaise

Cuestiones relacionadas