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:
id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
descripcion VARCHAR(30),
fecha TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE = MyISAM;
Insertamos una serie de filas y la tabla queda así de llena:
+----+------------------+---------------------+
| 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)
Utilizamos el CREATE TABLE … SELECT …:
Query OK, 10 rows affected (0.08 sec)
Records: 10 Duplicates: 0 WARNINGS: 0
Observamos las diferencias de las tablas:
+-------------+-------------+------+-----+-------------------+----------------
| 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)</code>
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)
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:
- No traspasa PRIMARY KEYs
- No traspasa FOREIGN KEYs
- No traspasa las definiciones de AUTO_INCREMENT
- No traspasa las definiciones de DEFAULT CURRENT_TIMESTAMP
- La tabla se crea con el motor de almacenamiento por defecto de MySQL
- Solo traspasa los registros afectados por la SELECT
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


Uri
julio 21, 2008
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
Luciano
julio 21, 2008
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.
Alfredo Herrejon
septiembre 11, 2008
Muchas Gracias, me ahorraron muchisimo tiempo
Luciano
septiembre 11, 2008
De nada, gracias a ti por comentar!
difercm
marzo 16, 2009
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…..
miguel
abril 25, 2011
en que casos nos serviria clonar una tabla???????????
daniel
abril 25, 2011
el que se puede aplicar el uso las tablas clonadas
sing88
septiembre 13, 2011
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.
vic
noviembre 23, 2011
Muchas gracias, me fue muy útil
Daniel
diciembre 14, 2011
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)