Clonar tablas en MySQL utilizando CREATE TABLE … SELECT …

La sentencia de creación CREATE TABLE … SELECT … nos permite crear una tabla con los registros devueltos por una consulta de selección (SELECT).

Observemos un ejemplo:

Creamos una tabla origen:


[MYSQL]
CREATE TABLE tabla_origen (
id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
descripcion VARCHAR(30),
fecha TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE = MyISAM;
[/MYSQL]

Insertamos una serie de filas y la tabla queda así de llena:


[MYSQL]
mysql> SELECT * FROM tabla_origen;
+----+------------------+---------------------+
| id | descripcion | fecha |
+----+------------------+---------------------+
| 1 | Primer Registro | 2008-07-20 16:42:16 |
| 2 | Segundo Registro | 2008-07-20 16:42:16 |
| 3 | Tercer Registro | 2008-07-20 16:42:16 |
| 4 | Cuarto Registro | 2008-07-20 16:42:16 |
| 5 | Quinto Registro | 2008-07-20 16:42:16 |
| 6 | Sexto Registro | 2008-07-20 16:42:16 |
| 7 | Séptimo Registro | 2008-07-20 16:42:16 |
| 8 | Octavo Registro | 2008-07-20 16:42:16 |
| 9 | Noveno Registro | 2008-07-20 16:42:16 |
| 10 | Décimo Registro | 2008-07-20 16:42:16 |
+----+------------------+---------------------+
10 rows in set (0.00 sec)
[/MYSQL]

Utilizamos el CREATE TABLE … SELECT …:


[MYSQL]
mysql> CREATE TABLE clone_select SELECT * FROM tabla_origen;
Query OK, 10 rows affected (0.08 sec)
Records: 10 Duplicates: 0 Warnings: 0
[/MYSQL]

Observamos las diferencias de las tablas:


[CODE]
mysql> DESCRIBE tabla_origen;
+-------------+-------------+------+-----+-------------------+----------------
| Field | Type | Null | Key | Default | Extra
+-------------+-------------+------+-----+-------------------+----------------
| id | int(11) | NO | PRI | NULL | auto_increment
| descripcion | varchar(30) | YES | | NULL |
| fecha | timestamp | NO | | CURRENT_TIMESTAMP |
+-------------+-------------+------+-----+-------------------+----------------
3 rows in set (0.00 sec)

mysql> DESCRIBE clone_select;
+————-+————-+——+—–+———————+——-+
| Field | Type | Null | Key | Default | Extra |
+————-+————-+——+—–+———————+——-+
| id | int(11) | NO | | 0 | |
| descripcion | varchar(30) | YES | | NULL | |
| fecha | timestamp | NO | | 0000-00-00 00:00:00 | |
+————-+————-+——+—–+———————+——-+
3 rows in set (0.00 sec)

mysql> SELECT table_name, engine FROM information_schema.tables WHERE table_name
IN (‘tabla_origen’,’clone_select’) AND table_schema = ‘test’;
+————–+——–+
| table_name | engine |
+————–+——–+
| clone_select | InnoDB |
| tabla_origen | MyISAM |
+————–+——–+
2 rows in set (0.00 sec)
[/CODE]

El método es algo tonto, pues solo se limita a enviar el resultado a una tabla (como si esa tabla se tratase de un archivo), consecuentemente tiene las siguientes limitaciones:

Ahora, si lo que queremos es copiar es solo la estructura de la tabla, podemos utilizar la sentencia LIKE, por ejemplo, CREATE TABLE clone_like LIKE tabla_origen. Así clonaremos la tabla, pero no su contenido. Hay que aclarar además, que salvo las FOREIGN KEYs, el resto de la metadata así como el storage engine será bien clonado.

Vía: cambrico.net

Tags: ,


  • Uri

    Este post te lo has copiado asi enterito de otro blog no???

    madre mia!!!

    como minimo podrias haber copiado la url de la que sacaste TODA la información

    http://cambrico.net/mysql/duplicar-o-clonar-tablas-en-mysql

    Reply

  • Luciano Post author

    Dos cosas:
    El ejemplo es el mismo, pero la prosa es mía (aunque basada en la publicación original)

    Segundo, me parece que no has prestado suficiente atención, la fuente la citado al final, Vía: cambrico.net

    No acostumbro, ni tampoco es mi intención, tomar créditos por el trabajo de otro, de hecho valoro la propiedad de cada uno y por tal motivo cito las referencias.

    Gracias por el comentario de todas formas.

    Saludos.

    Reply

  • Alfredo Herrejon

    Muchas Gracias, me ahorraron muchisimo tiempo

    Reply

  • Luciano Post author

    De nada, gracias a ti por comentar!

    Reply

  • difercm

    Hola muy buena explicacion!!
    Pero si lo que necesitas es clonar la tabla de dos bases de datos diferentes?? por ejemplo la tabla A, de la base de datos A, del Host A; y la quieres clonar en la base de datos B, del Host B?
    espero haber sido claro y gracias por una guia para poder hacer esto…..

    Reply

  • miguel

    en que casos nos serviria clonar una tabla???????????

    Reply

  • daniel

    el que se puede aplicar el uso las tablas clonadas

    Reply

  • sing88

    Esto te sirve cuando tienes data y deseas depurarlas, en mi caso tengo una tabla con data sucia por asi decirlo, q tiene 14 millones de registros, de los cuales debo filtrar solo los datos validos.

    Reply

  • vic

    Muchas gracias, me fue muy útil

    Reply

  • Daniel

    interesante el articulo.

    agrego un par de comentarios y listo 🙂

    la idea de el create/select no es la de clonar tablas (para eso mejor el create lyke) sino que poder crear tablas con el resultado de una consulta. Por ejemplo tienes 3 o 4 tablas muy grandes que necesitas juntar para crear un reporte, podrias ir creando tablas temporales (de paso) solamente con los select, para llegar al resultado en una tabla final a la que le agregas los indices y la creas con el engine correcto (supongo que al igual que en oracle debe permitir agregarlo dentro del mismo create)

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *