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
12
A
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)
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.
Cuestiones relacionadas
- 1. Campos autorreferenciales en mensajes protobuf
- 2. Creando tablas autorreferenciales con polimorfismo en SQLALchemy
- 3. MySQL cómo unir tablas en dos campos
- 4. LINQ to SQL para tablas autorreferenciales?
- 5. Crear un árbol a partir de tablas autorreferenciales en SQLalchemy
- 6. ¿Cómo crear tablas con campos de contraseña en mysql?
- 7. MYSQL - ¿Cómo exportaría las tablas especificando solo ciertos campos?
- 8. ¿Demasiados campos en MySQL?
- 9. MySQL - Unir 2 tablas
- 10. tablas de separación mysql
- 11. Relaciones autorreferenciales múltiples en SQLAlchemy
- 12. Convertir tablas y campos utf8_general_ci en utf8_unicode_ci
- 13. MySQL: restricción única en campos múltiples
- 14. mySQL MATCH en varias tablas
- 15. Ordenando múltiples campos en MySQL
- 16. Estructuras de datos autorreferenciales en Lisp/Scheme
- 17. MySQL loop through tablas
- 18. MySQL GROUP_CONCAT campos múltiples
- 19. MYSQL unirse a las tablas varias veces
- 20. Número máximo de tablas en MySQL
- 21. COUNT (*) de varias tablas en MySQL
- 22. Mostrar solo tablas con ciertos patrones en mysql "mostrar tablas"
- 23. Configuración óptima de tablas temporales de MySQL (tablas de memoria)?
- 24. ¿Cómo funciona lastInsertId() para tablas sin campos autoincrementados?
- 25. Los mismos campos en la mayoría de las tablas
- 26. MySQL OPTIMIZE todas las tablas?
- 27. Generar datos para tablas MySQL
- 28. MySQL seleccione Unir 3 Tablas
- 29. mysql seleccionar fechas sin tablas
- 30. ¿Es necesario colocar tablas temporales en mysql?
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
@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. –