2011-03-09 40 views
78

que estoy tratando de mover los datos antiguos de:INSERT INTO ... SELECT para todas las columnas de MySQL

this_table >>this_table_archive

copiar todas las columnas más. He intentado esto, pero no funciona:

INSERT INTO this_table_archive (*) VALUES (SELECT * FROM this_table WHERE entry_date < '2011-01-01 00:00:00');

Nota: las mesas son idénticos y tienen id conjunto como clave principal.

+1

Definir "no funciona". Estoy teniendo un problema similar pero no lo sé porque no dijiste cuál era tu problema. –

+0

No está roto, simplemente no funciona. –

+0

Vea también aquí [https://stackoverflow.com/questions/3709560/joining-three-tables-using-mysql](https://stackoverflow.com/questions/3709560/joining-three-tables-using-mysql) –

Respuesta

152

La sintaxis correcta se describe en el manual. Prueba esto:

INSERT INTO this_table_archive (col1, col2, ..., coln) 
SELECT col1, col2, ..., coln 
FROM this_table 
WHERE entry_date < '2011-01-01 00:00:00'; 

Si las columnas ID es una columna de incremento automático y ya dispone de algunos datos en ambas tablas a continuación, en algunos casos, es posible que desee omitir el ID de la lista de columnas y generar nuevos identificadores de lugar a evite insertar una identificación que ya existe en la tabla original. Si su tabla objetivo está vacía, esto no será un problema.

51

Para la sintaxis, que se parece a esto (no incluya la lista de columnas que significa implícitamente "todos")

INSERT INTO this_table_archive 
SELECT * 
FROM this_table 
WHERE entry_date < '2011-01-01 00:00:00' 

Para evitar errores de clave principal si ya tiene datos en la tabla de archivo

INSERT INTO this_table_archive 
SELECT t.* 
FROM this_table t 
LEFT JOIN this_table_archive a on a.id=t.id 
WHERE t.entry_date < '2011-01-01 00:00:00' 
    AND a.id is null # does not yet exist in archive 
+4

+1 para la combinación de la izquierda para evitar colisiones de teclas principales. –

4

¿No necesita el doble() para el bit de valores? si no probar esto (aunque tiene que haber una mejor manera

insert into this_table_archive (id, field_1, field_2, field_3) 
values 
((select id from this_table where entry_date < '2001-01-01'), 
((select field_1 from this_table where entry_date < '2001-01-01'), 
((select field_2 from this_table where entry_date < '2001-01-01'), 
((select field_3 from this_table where entry_date < '2001-01-01')); 
+1

El OP está utilizando 'INSERT INTO .. ​​SELECT FROM', no' INSERT INTO .. ​​VALUES'. Característica diferente –

15

adición con Mark Byers respuesta:

A veces también desea insertar Hardcoded detalles cosa puede haber restricción único fallo etc Por lo tanto el uso siguiente en tal situación en la que se anula algunos valores de las columnas.

INSERT INTO matrimony_domain_details (domain, type, logo_path) 
SELECT 'www.example.com', type, logo_path 
FROM matrimony_domain_details 
WHERE id = 367 

Aquí dominio valor se añade por mí mí en forma codificada para deshacerse de Restricción única

Cuestiones relacionadas