2010-01-27 24 views
5

Tengo una instrucción sql de inserción, p.Insertar en cuando el número de columnas no coincide con el número de valores

INSERT INTO `table_a` (`col_a`, `col_b`, `col_c`, `col_d`) VALUES 
(1, 2, 3, 4), 
(2, 1, 6, 9), 
(3, 1, 4, 5) 

quiero insertarlo en otra tabla, sin embargo la tabla quiero insertarlo en tiene una estructura diferente a la de la instrucción SQL (que tiene menos campos), por ejemplo,

table_b has columns 'col_a', 'col_b', 'col_d' 

¿Qué tengo que hacer para el DECLARACIÓN SQL original, de modo que puedo conseguirlo para insertarlo en table_b. Supongo que sería algo así como ignorar el valor que está en col_c y enviarlo a una variable temporal en lugar de a un campo.e.g.

INSERT INTO `table_b` (`col_a`, `col_b`, @temp_var, `col_d`) VALUES 
(1, 2, 3, 4), 
(2, 1, 6, 9), 
(3, 1, 4, 5) 
+0

¿Por qué no puede simplemente omitir los valores que no desea insertar? – balpha

Respuesta

3

utilizar una tabla temporal:

CREATE TEMPORARY TABLE myTemp (
col_a integer, 
col_b integer, 
col_c integer, 
col_d integer 
); 
INSERT INTO myTemp (col_a, col_b, col_c, col_d) VALUES (1, 2, 3, 4), (2, 1, 6, 9), (3, 1, 4, 5); 
INSERT INTO table_a (SELECT col_a,col_b,col_d FROM myTemp); 

La tabla se elimina una vez que finaliza su sesión (o puede eliminarla manualmente)

+0

Esta es una solución realmente inteligente, ¡me gusta! –

+0

Sí, esto funcionó para mí. Gracias por tu ayuda. – John

3

¿Qué tal lo quitamos?

INSERT INTO table_b (col_a, col_b, col_d) VALUES (1, 2, 4), (2, 1, 9), (3, 1, 5) 
+1

La inserción en la declaración SQL que tengo tiene más de 100 filas para insertar, por lo que no quiero pasar y eliminar manualmente los valores falsos. Tampoco tengo acceso a la tabla original, así que no puedo eliminarla de la exportación, ya sea – John

+1

@John: ¿podría escribir una secuencia de comandos para modificar el SQL y eliminar los valores que no desea insertar? –

+0

Podría, pero pensé que podría haber una manera fácil en la que simplemente podría cambiar el nombre de la columna a un nombre de variable y mysql simplemente insertaría el valor en esta variable temporal en lugar de la base de datos. Si no, tendré que escribir algo para manejar esto o ingresar los datos manualmente :( – John

2

Ésta es feo, y simplemente he tratado en en SQLite, pero puedo imagen que también funciona en MySQL (la documentationno lo hace dicen que es no permitido) (actualización: ver el comentario de John, no lo hace trabajo en MySQL):

sqlite> create table t(a,b,c); 
sqlite> insert into t (a,b,b,c) values (1,2,3,4); 
sqlite> select * from t; 
1|2|4 
+0

No estoy seguro de cómo funcionaría eso está insertando valores en una columna dos veces y, en todo caso, esperaría que sobreescriba el 2 con el 3. Gracias por su ayuda y lo intentaré. – John

+0

@John: Sí, es extraño. Sin embargo, sería interesante hay documentación que realmente define el comportamiento previsto de esta consulta. – balpha

+0

lo intenté y no funcionó. El error devuelto fue: MySQL dijo: # 1110 - Columna 'tipo_id' especificada dos veces – John

Cuestiones relacionadas