Crear una tabla a partir de otra en MySQL con y sin su contenido

Hay veces que queremos crear una tabla igual a otra con parte de su contenido, un caso sería cuando tenemos una tabla de transacciones que tiene varios millones de registros y las consultas para los reportes demoran, lo que hacemos en estos casos (después de estar seguros que están creados los indices) es crear tablas de Histórico, o sea que separaríamos el contenido de la tabla de transacciones en varias tablas, puede ser una tabla por año, por semestre, por trimestre o mensual, todo depende la cantidad de registros que generemos por día. En MySQL por mi experiencia con tablas bien optimizadas consultar datos sobre una tabla de mas de 5 millones de registros tiende a tornarse en respuestas lentas.

Por eso una solución es separar el contenido en fracciones y en la lógica de nuestra aplicación resolver según los filtros de nuestros informes sobre las transacciones para saber si consultamos sobre la tabla corriente, una tabla de histórico o varias tablas usando la cláusuala UNION en nuestras consultas SELECT para obtener todos los registros de ese periodo.

Por lo general el set de datos que se suelen consultar en sistemas son de un periodo corto, ya que la información se usa por lo general para cerrar balances mensuales, trimestrales, saber cuando dinero se está ganando, etc; depende de la empresa y el rubro, pero generalmente las personas que manejan esta información quieren tener toda la información disponible y que sus reportes sean rápidos y eficientes.

Con esta solución lo que hacemos es mejorar el tiempo de respuestas para el 99% de las consultas, ya que las consultas de histórico se usan para detectar algún patrón o para analizar sobre algún problema presentando en el negocio.

A continuación presento la sintaxis de como crear una tabla a partir de otra (Tabla de Histórico) + varios ejemplos.

-- Ejemplo 1: Crear una tabla a partir de otra sin su contenido, solo la estructura.
-- Sintaxis:
CREATE TABLE NombreNuevaTabla LIKE NombreTablaOrigen ;
CREATE TABLE sales_2008 LIKE sales;
--

Después de ejecutar esta sentencia SQL podremos ver que se crea una nueva tabla llamada sales_2008 con la misma estructura que sales pero vacía. Podremos llenarla posteriormente con una consulta del tip INSERT INTO SELECT.

Tal ves lo que queramos es crear una tabla identica a la original, puede ser para respalo, con todo los datos a la fecha;

-- Ejemplo 2: Crear una tabla a partir de otro con la copia de todo su contenido
-- Sintaxis:
CREATE TABLE NombreNuevaTabla SELECT * FROM NombreTablaOrigen;
CREATE TABLE sales_2009 SELECT * FROM sales;
--

En el siguiente ejemplo se presenta la forma de crear una tabla a partir de otra con parte de su contenido, este caso podría ser para crear una tabla de histórico del año 2010.

-- Ejemplo 3: Crear una tabla de histórico limitando a un set de datos con un filtro por fecha.
-- Sintaxis:
CREATE TABLE NombreNuevaTabla SELECT * FROM NombreTablaOrigen WHERE Field_Date >= '2010-01-01 00:00:00' AND Field_Date < '2011-01-01 00:00:00'; -- Campo tipo datetime
CREATE TABLE sales_2010 SELECT * FROM sales WHERE sales_date >= '2010-01-01 00:00:00' AND sales_date < '2011-01-01 00:00:00'; -- Campo tipo datetime -- 

En el próximo ejemplo veremos la forma de crear una tabla a partir de otra, con parte de su contenido y especificando que campos tendrá la nueva tabla.

 
-- Ejemplo 4: Crear una tabla de histórico limitando a un set de datos con un filtro por fecha y especificando los campos que tendrá 
-- Sintaxis: 
CREATE TABLE NombreNuevaTabla SELECT Campo1, Campo2, Campo3, CampoN FROM NombreTablaOrigen WHERE `Field_Date` >= '2010-01-01 00:00:00' AND `date` < '2011-01-01 00:00:00'; 
CREATE TABLE sales_2010 SELECT id,date,external_id,status,ip FROM sales WHERE sales_date >= '2010-01-01 00:00:00' AND sales_date < '2011-01-01 00:00:00';
--Para ver los campos de la nueva tabla
DESC sales_2010;
--