2010-09-20 22 views
14

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

+2

¿Alguna vez has logrado hacer esto? Estoy tratando de resolver esto ahora, pero realmente no puedo hacer que funcione. –

+1

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

Respuesta

5

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; 
2

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().

+0

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

2

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:

  1. Volcar la base de datos utilizando mysqldump -> se obtiene file.sql
  2. Crear una nueva base de datos
  3. 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.

0

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

-2

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; 
Cuestiones relacionadas