2011-09-14 27 views
5

Podría resolverlo con php o en otro idioma, pero me gustaría obtener más información sobre SQL.Inserte datos de otra tabla con un bucle en mysql

¿Hay una manera de resolver esto:

Tengo dos tablas (y no puedo cambiar la estructura), uno content con algunos datos y el otro content_info con alguna información adicional. Están relacionados de esa manera: content.id = content_info.content_id.

Lo que me gustaría hacer: Si no hay un conjunto de datos en content_info pero en content, me gustaría copiarlo, que al final hay el mismo número de conjuntos de datos en ambas tablas. Traté de esa manera, pero por desgracia no funciona:

... 
BEGIN 
    (SELECT id, ordering FROM content;) 
    cont:LOOP 
    @cid = SELECT content_id FROM content_info WHERE content_id = (id) 
    IF @cid != (id) THEN 
     INSERT INTO content_info SET content_id = (id), ordering = (ordering) 
     ITERATE cont; 
    END IF; 
    END LOOP cont; 
END 
.. 

tiene a alguien una idea, o no es posible que al final? ¡Gracias por adelantado!

Respuesta

7

Puede utilizar INSERT IGNORE para insertar nuevas filas pero no hacen nada si ya hay una fila en la tabla que provocaría un error de entrada duplicada.

INSERT IGNORE INTO jos_content_frontpage (content_id, ordering) 
SELECT id, ordering FROM jos_content 
+0

¡Esto también funciona, también es bueno y práctico! ¡Muchas gracias! – Andreas

2

Parece que está buscando la sintaxis INSERTAR ... SELECCIONAR. Cualquier selección que se pueda insertar en una tabla le proporcionará el formato de los datos para que coincida con la tabla de destino.

Además, su sintaxis INSERT es incorrecta, parece que está utilizando la sintaxis UPDATE.

INSERT INTO table (field1, field2, field3) VALUES ('1','2','3'); 

INSERT INTO table (field1, field2, field3) SELECT field1, field2, field3 FROM ... 
+0

Viene cerca, pero en realidad no funciona para mí, porque no hay datos ya existentes en la tabla, que no quiero ni para sobrescribir , ni para borrar. Y probar esto sin hacer una eliminación provoca (por supuesto) un error: '# 1062 - Entrada duplicada '5' para la clave 'PRIMARY''. Pero definitivamente es una buena pista: ¡1 votación! – Andreas

+0

Por lo que vale, la sintaxis 'INSERTAR ... FIJAR campo = valor' es SQL válido y estándar. Me gusta utilizarlo cuando hay una gran cantidad de columnas para establecer y es fácil ubicarlas en el orden incorrecto cuando debe mantener dos listas, una para columnas y otra para VALUES. Pero esta forma de sintaxis no admite "INSERT" o "INSERTAR ... SELECCIONAR" de varias filas –

+0

Puede usar INSERTAR IGNORAR para suprimir los errores, o su selección puede hacer una UNIÓN en la tabla en la que está insertando para filtrar datos que ya están allí. La sintaxis SET no funcionará con INSERT ... SELECCIONAR –

1

Daré un ejemplo para un solo campo, el campo de identificación. Se pueden añadir otros campos también:

insert into content_info(content_id) 
select content.id 
from content left outer join content_info 
on (content.id=content_info.content_id) 
where content_info.content_id is null 

otra manera

insert into content_info(content_id) 
select content.id 
from content 
where not exists (
    select * 
    from content_info 
    where content_info.content_id = content.id 
) 
+0

Eso funciona absolutamente bien para mí. ¡Aclamaciones! – Andreas

Cuestiones relacionadas