2011-09-14 8 views
5

phpなどの言語で解決できますが、もっとSQLを学びたいと思っています。mysqlのループを使って別のテーブルのデータを挿入してください

これを解決する方法はあります:

私は2つのテーブル(と私は構造を変更することはできません)、1いくつかのデータとcontentといくつかの追加情報を他のcontent_infoを持っています。彼らはそのように関係しています:content.id = content_info.content_id

私がしたいこと:content_infoにデータセットがなく、contentにデータセットがない場合は、最後に両方のテーブルに同じ数のデータセットがあることをコピーしたいと思います。私はそのようにしようとしたが、残念ながらそれは動作しません:

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

は誰かのアイデアを持っている、またはそれが最後に可能ではないでしょうか?前もって感謝します!

答えて

7

あなたは、新しい行を挿入したが、既に重複入力エラーを引き起こすテーブルの行があるかどう何もしないことINSERT IGNOREを使用することができます。

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

これも便利です。どうもありがとう! – Andreas

2

INSERT ... SELECT構文を探しているようです。任意の選択をテーブルに挿入して、ターゲットテーブルに一致するようにデータをフォーマットすることができます。

また、INSERT構文が正しくありません。これは、UPDATE構文を使用しているようです。

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

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

それは近づくが、私はどちらも上書きするか、テーブル内の既存のデータは、すでに存在するため、実際には、私のために動作しません。削除することもできません。そして、これを削除せずに試みると、(もちろん)エラーが発生します: '#1062 - キー 'PRIMARY'に重複するエントリ '5'。しかし、それは間違いなく良いヒントです:1 upvote! – Andreas

+0

それは価値があるので、 'INSERT ... SET field = value'構文は有効で標準SQLです。設定する列数が多い場合や、列とVALUESの2つのリストを維持する必要がある場合に、誤った順序で取得するのは簡単です。しかし、この構文形式は複数行の 'INSERT'や' INSERT ... SELECT'をサポートしていません –

+0

INSERT IGNOREを使用してエラーを抑止するか、またはselectを使用してフィルタに挿入する表のJOINを実行できますすでにそこにあるデータを削除します。 SET構文はINSERT ...では機能しません。SELECT –

1

ここでは、1つのフィールドのみの例としてidフィールドを示します。あなたも他のフィールドを追加することができます。

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 

を別の方法

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

それは私のために絶対にうまく動作します。乾杯! – Andreas

関連する問題