Mysql

2011-09-14 20 views
5

içinde bir döngü ile başka bir tablodan veri ekleme php veya başka bir dil ile çözebilirdim ama daha fazla SQL öğrenmek için sabırsızlanıyorum.Mysql

bu çözmenin bir yolu var mı:

İki tablo (ve yapısını değiştiremez), bir bazı verilerle content ve bazı ek bilgilerle diğer content_info var. Bu şekilde ilgili: content.id = content_info.content_id.

Ne yapmak isterim: content_info içinde ancak content numaralı veri kümesinde bir veri kümesi yoksa, bunu kopyalamak istiyorum, sonuçta her iki tabloda da aynı sayıda veri kümesi vardır. O şekilde çalıştı, ancak ne yazık ki çalışmıyor:

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

bir fikir birisi Has, yoksa sonunda mümkün değil mi? Şimdiden teşekkürler! Eğer INSERT ... SELECT sözdizimi aradığınız gibi

cevap

7

Sen yeni satırlar eklemek ama zaten yinelenen bir giriş hataya neden olur tablodaki bir satır varsa hiçbir şey yapmak INSERT IGNORE kullanabilirsiniz.

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

Ayrıca bu da güzel ve kullanışlı! Çok teşekkürler! – Andreas

2

görünüyor. Herhangi bir seçim, tabloyu hedef tabloya uyacak şekilde biçimlendirmenizi sağlayan bir tabloya eklenebilir.

Ayrıca, INSERT sözdizimi yanlış, UPDATE sözdizimini kullandığınız gibi görünüyor.

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

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

başka bir yol ama aslında benim için çalışmıyor: Çok diğer alanları ekleyebilirsiniz ne de silmek için. Ve bunu bir silme yapmadan denemek bir hataya neden olur: (tabii ki) bir hata: '# 1062 - 'PRIMARY' anahtarının '5' girişini kopyala. Ama kesinlikle iyi bir ipucu: 1 upvote! – Andreas

+0

Değeri için 'INSERT ... SET alanı = değer' sözdizimi geçerli ve standart SQL'dir. Bunu yapmak için çok sayıda sütun olduğunda ve sütunlar için bir tane ve VALUES için bir tane olmak üzere iki listeyi korumanız gerektiğinde bunları yanlış sırada almanız çok kolay. Ancak bu sözdizimi formu çok satırlı 'INSERT' veya 'INSERT ... SELECT' desteklemiyor. –

+0

Hataları bastırmak için INSERT IGNORE kullanabilirsiniz veya seçiminiz filtreye eklediğiniz masada bir JOIN yapabilir zaten var olan verileri dışarı. SET sözdizimi INSERT ile çalışmaz ... SELECT –

1

Sadece bir alan için örnek vereceğim, id alanı. Ben ne üzerine yazmak istiyor tabloda zaten mevcut veri yoktur çünkü

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 

Bu yakın geliyor

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

Bu benim için kesinlikle iyi çalışıyor. Şerefe! – Andreas