Sé cómo copiar una tabla usando create new_table like old_table
, pero eso no copia las restricciones de clave externa también. También puedo hacer la manipulación de cadenas en el resultado de show create table old_table
(usando expresiones regulares para reemplazar el nombre de la tabla y los nombres de restricción de clave externa), pero eso parece propenso a errores. ¿Hay una mejor manera de copiar la estructura de una tabla, incluidas las claves externas?mysql: Copie la estructura de la tabla incluyendo claves externas
Respuesta
Posiblemente se podría escribir un procedimiento que después de la create table like
prepara ALTER TABLE ...
declaraciones, con base en información de:
SELECT *
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME LIKE '<table_name>'
AND TABLE_SCHEMA = '<db_name>'
AND REFERENCED_TABLE_NAME IS NOT NULL;
Si un poco de lado de scripts está bien, usted puede tomar ventaja de SHOW CREATE TABLE
en unas pocas líneas como entonces (PHP pero el concepto funciona en cualquier idioma):
// Get the create statement
$retrieve = "SHOW CREATE TABLE <yourtable>";
$create = <run the $retrieve statement>
// Isolate the "Create Table" index
$create = $create['Create Table'];
// Replace old table name with new table name everywhere
$create = preg_replace("/".$newname."/", $oldname, $create);
// You may need to rename foreign keys to prevent name re-use error.
// See http://stackoverflow.com/questions/12623651/
$create = preg_replace("/FK_/", "FK_TEMP_", $create);
// Create the new table
<run the $create statement>
No es muy elegante, pero funciona hasta ahora. Estoy haciendo esto en un entorno de prueba, así que puse esto en mi método setUp()
.
Este es el mejor enfoque si se trata de una operación con guiones. Es triste que CREATE TABLE LIKE esté completo al 95%. Yo [escribí sobre mis soluciones finales para copiar un archivo db] (https://medium.com/@igorsantos07/a-not-so-small-rant-on-mysql-based-techniques-to-copy-database-structures- 4333f8ff8384 # .8qiega4cq), si eso es útil para cualquier persona. Combiné varios temas relacionados, como el que se presenta en esta pregunta. – igorsantos07
La respuesta de Wrikken me inspiró. Déjame extenderlo.
Bueno, las cosas son más complicadas. Ver: http://dev.mysql.com/doc/refman/5.1/en/create-table.html. Dice que también habrá problemas con las tablas TEMPORARY
y otras cosas. La solución mencionada por Wrikken es un buen enfoque, sin embargo, se necesita por lo menos una vez más las operaciones de búsqueda para obtener información sobre UPDATE
y DELETE
reglas:
SELECT *
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
WHERE TABLE_NAME LIKE '<table_name>'
AND CONSTRAINT_SCHEMA = '<db_name>';
Por lo tanto, podría ser una buena idea para obtener una herramienta que simplifica la tarea. Personalmente uso Adminer (https://sourceforge.net/projects/adminer/). Viene con una opción para exportar toda la base de datos (con todas las tablas, activadores, claves externas, ...). Una vez que lo exporte (en sintaxis de SQL) puede cambiar fácilmente el nombre de la base de datos e importarlo de nuevo. Escribí sobre eso en la sección de errores del proyecto (ver ticket 380).
Quizás ya tengas tu administrador de bases de datos favorito y no quieras tener otro. Se podría seguir los pasos a continuación:
- Volcar la base de datos utilizando
mysqldump
-> se obtienefile.sql
- Crear una nueva base de datos
- Ejecutar
file.sql
en el nuevo DB
Tanto Adminer
y mysqldump
tienen una opción para seleccionar solo tablas específicas para que no tenga que exportar toda la base de datos. Si necesita solo la estructura, no los datos, use la opción -d
para mysqldump
o haga clic en Adminer
.
Si tiene phpMyAdmin, puede exportar solo la estructura de su tabla, luego cambie los nombres de las tablas antiguas a nuevas en su archivo .sql e impórtelo de nuevo.
Es la forma más rápida
Si lo que desea es limpiar su mesa, puede copiar todos los datos relevantes a su mesa de copia. Que truncar y copiar de nuevo. El resultado es que tienes tu FK preservado.
CREATE TABLE IF NOT EXISTS t_copy LIKE t_origin;
INSERT INTO t_copy
SELECT t_origin.*
FROM t_origin;
SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE t_origin;
INSERT INTO t_origin
SELECT t_copy.*
FROM t_copy;
DROP TABLE t_copy;
SET FOREIGN_KEY_CHECKS = 1;
- 1. Copie la estructura de la tabla en la nueva tabla
- 2. Las claves externas y NULL en MySQL
- 3. claves externas en la tabla de base de datos diferente
- 4. ¿La introducción de claves externas a MySQL reduce el rendimiento?
- 5. ¿Qué son las claves externas de MySQL?
- 6. Conceptos básicos de claves externas en MySQL?
- 7. Copie la estructura de la tabla en la nueva tabla en sqlite3
- 8. ¿Cómo copiar la estructura de la tabla MySQL a la tabla en la memoria?
- 9. Particionar tablas mySQL que tiene claves externas?
- 10. MySQL terminología "restricciones" vs diferencia "claves externas"?
- 11. MySQL Error 150 - Las claves externas
- 12. ¿Alguien puede explicar las claves externas de MySQL?
- 13. ¿Cómo usar claves externas y un índice espacial dentro de una tabla MySQL?
- 14. copiar una tabla de MySQL incluyendo índices
- 15. ¿Cómo duplicar una tabla con claves y otras características de estructura conservadas en MySQL?
- 16. MySQL - Cómo insertar en varias tablas con claves externas
- 17. Cómo script de índices, claves, claves externas en SQL Server
- 18. Django: cómo tener una varias claves externas hace referencia a la misma tabla en una tabla
- 19. phpmyadmin y claves externas
- 20. ¿Debo usar claves externas?
- 21. Django: claves externas distintas
- 22. SQLMetal claves externas múltiples señalando una tabla Edición
- 23. descartar claves externas duplicadas
- 24. Duplicar la tabla de mysql "estructura" usando PHP solamente
- 25. Consulta para encontrar claves externas
- 26. mysql alterar columna int a letra grande con claves externas
- 27. propuesta de estructura de tabla mysql?
- 28. Crear una tabla (estructura) de la tabla
- 29. claves externas de visualización de la lista Django administrador
- 30. Tabla nativa 'performance_schema'. '???' tiene la estructura equivocada
¿Alguna vez has logrado hacer esto? Estoy tratando de resolver esto ahora, pero realmente no puedo hacer que funcione. –
Es triste que CREATE TABLE LIKE cree el 95% de las tablas ... Yo [escribí sobre mis soluciones finales para duplicar un db] (https://medium.com/@igorsantos07/a-not-so-small-rant- on-mysql-based-techniques-to-copy-database-structures-4333f8ff8384 # .8qiega4cq), si eso es útil para cualquier persona. Combiné varios temas relacionados, como el que se presenta en esta pregunta. – igorsantos07