2011-09-14 21 views
5

Potrei risolverlo con php o qualche altra lingua, ma sono desideroso di saperne di più SQL.Inserire dati da un'altra tabella con un loop in mysql

C'è un modo per risolvere questo:

Ho due tabelle (e non posso cambiare la struttura), uno content con alcuni dati e l'altro content_info con alcune informazioni aggiuntive. Sono correlati in questo modo: content.id = content_info.content_id.

Quello che vorrei fare: se non v'è alcun set di dati in content_info ma in content, vorrei copiare sopra, che alla fine ci sono lo stesso numero di set di dati in entrambe le tabelle. Ho cercato in questo modo, ma purtroppo non funziona:

... 
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 
.. 

ha qualcuno un'idea, o non è possibile alla fine? Grazie in anticipo!

risposta

7

È possibile utilizzare INSERT IGNORE per inserire nuove righe, ma non fare nulla se c'è già una riga nella tabella che avrebbe causato un errore di voce duplicata.

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

Anche questo funziona bene e comodo! Molte grazie! – Andreas

2

Sembra che tu stia cercando la sintassi INSERT ... SELECT. Qualsiasi selezione può essere inserita in una tabella, a condizione di formattare i dati in modo che corrispondano alla tabella di destinazione.

Inoltre, la sintassi INSERT non è corretta, sembra che si stia utilizzando la sintassi UPDATE.

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

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

Si avvicina, ma in realtà non funziona per me, perché ci sono dei dati già esistenti nella tabella, che non voglio né di sovrascrivere , né cancellare. E provare questo senza fare un delete causa (ovviamente) un errore: '# 1062 - Duplicate entry '5' per key 'PRIMARY''. Ma è sicuramente un buon suggerimento: 1 upvote! – Andreas

+0

Per quello che vale, la sintassi 'INSERT ... SET field = value' è valida e SQL standard. Mi piace usarlo quando c'è un gran numero di colonne da impostare ed è facile ottenerle nell'ordine sbagliato quando devi mantenere due liste, una per le colonne e una per i VALORI. Ma questa forma di sintassi non supporta 'INSERT' multi-riga o' INSERT ... SELECT' –

+0

Puoi usare INSERTO IGNORE per sopprimere gli errori, oppure la tua selezione può fare un JOIN sulla tabella che stai inserendo per filtrare fuori i dati che sono già lì. La sintassi SET non funzionerà con INSERT ... SELEZIONA –

1

Fornirò un esempio per un solo campo, il campo id. è possibile aggiungere altri campi:

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 

un altro modo

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

Questo funziona perfettamente per me. Saluti! – Andreas

Problemi correlati