2011-10-17 23 views
6

新しいテーブルに2つのテーブルのレコードを設定しようとしています。複数テーブルのレコードを新しいテーブルに挿入する

period_states新しい/空の

period_states 
    id 
    period_id 
    sla_id 

期間である - 15、レコード

periods 
    id 

のSLAが含まれています - 私が持つ既存の各sla_idとperiod_statesを移入する必要がある84個の記録

slas 
    id 

が含まれています各終了period_id。したがって、最終的にperiod_statesに1260レコードが存在するはずです。

これを自動化する方法はありますか?手動で設定するのは悪夢です...

ありがとうございます!

+1

テーブル 'period_states'の' id'フィールドは 'auto_increment'に設定されていますか? –

答えて

4
INSERT INTO period_states 
(period_id, sla_id) 
SELECT periods.id, slas.id 
FROM periods 
CROSS JOIN slas 
+0

私は自分の答えが間違っていると言っているわけではありませんが、コメントから判断すると、@ spencer7593の回答 –

+2

の回答が正しいと思われるようです。これは「選択された」回答なので、ここではMySQLで「JOIN」、「INNER JOIN」および「CROSS JOIN」は同義語であるというコメントを追加します。 ANSI SQL仕様は、デカルト積を生成する条件のない結合として「クロスジョイン」を定義しています。ステートメントに「CROSS」キーワードを含めることは(必要でない場合でも)ドキュメントとして機能し(あいまいさを除去し、より明確にするため)、ステートメントを他のRDBMSに移植しやすくします。 – spencer7593

+1

@ spencer7593それを指摘してくれてありがとう。私は将来の読者のために答えを更新しました。また、完全性のためにあなたの答えを投票した –

6

期間状態のid列が、これは動作するはずです、AUTO_INCREMENTとして定義されている場合:

INSERT INTO period_states (period_id, sla_id) 
SELECT p.id AS period_id 
    , s.id AS sla_id 
    FROM periods p 
CROSS 
    JOIN slas s 

そして、ここではid列の値を供給する一つの方法の例です:

INSERT INTO period_states (id, period_id, sla_id) 
SELECT @myid := @myid + 1 AS id 
    , p.id AS period_id 
    , s.id AS sla_id 
    FROM periods p 
CROSS 
    JOIN slas s 
CROSS 
    JOIN (SELECT @myid := 0) m 
+0

恐ろしい - それだった。私が知らなかったのは "十字架"の機能です。はい、period_statesのIDは自動的にインクリメントされます。束ねてありがとう! –

+0

あなたのために働いてうれしいケイティー。 – spencer7593

2
insert into period_states select null, periods.id, slas.id from periods, slas 
関連する問題