2012-10-22 17 views
16

内側副SELECTは、私がテーブルにmap_tags呼ばれています:のPostgreSQL:挿入

map_id | map_license | map_desc 

そして、その記録map_tagsのレコードを参照する外部キー(1〜1)が含まれ、別のテーブル(widgets):

を私は map_licensewidget_nameを持っている場合は、その後、私は挿入を実行したいすべての map_license Sがユニークである制約を(ただし map_tags上のキーとして設定されていない)、与えられた
widget_id | map_id | widget_name 

widgetsにすべて同じSQL文の内側:

INSERT INTO 
    widgets w 
(
    map_id, 
    widget_name 
) 
VALUES (
    (
     SELECT 
      mt.map_id 
     FROM 
      map_tags mt 
     WHERE 
      // This should work and return a single record because map_license is unique 
      mt.map_license = '12345' 
    ), 
    'Bupo' 
) 

私は正しい軌道に乗ってんだけど、これはPostgresのための不正なSQLであることを右のバットを知っを信じ。そのような単一のクエリを達成するための適切な方法を誰かが知っていますか?

+1

は、PostgreSQLでそれをやったことがないが、それはMAP_ID、 'NULLを選択するウィジェット。INSERT INTOのように見てはいけない12345''? – raina77ow

+0

ありがとう@ raina77ow(+1) - それが必要なのかどうかはわかりません。 '(...)VALUES(...)'構文の代わりに 'SELECT'文が間違いなく私を捨ててしまいます。それがどう動くべきか私に説明してもらえますか?再度、感謝します! –

+0

さて、私はMySQLの[this](http://dev.mysql.com/doc/refman/5.1/en/insert-select.html)のように使っています...理由は、あなたがVALUES((SELECT smth)、 'smth_else')はデータを挿入しないでください。 ) – raina77ow

答えて

18
INSERT INTO widgets 
(
    map_id, 
    widget_name 
) 
SELECT 
    mt.map_id, 'Bupo' 
FROM 
    map_tags mt 
WHERE 
    mt.map_license = '12345' 
+0

これは、挿入したいテーブルにSERIAL PKなどがある場合に便利な構文です – dougajmcdonald

26

ステートメントの定数を含め、INSERT INTO SELECTの亜種を使用してください。

INSERT PostgreSQLの構文は次のとおりです。上記の二行目の終わりにクエリオプションの

INSERT INTO table [ (column [, ...]) ] 
{ DEFAULT VALUES | VALUES ({ expression | DEFAULT } [, ...]) [, ...] | query } 
[ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ] 

メモします。

次はあなたの例です。 map_license =「map_tagsから、 'Bupo' を

INSERT INTO 
    widgets 
    (
     map_id, 
     widget_name 
    ) 
SELECT 
    mt.map_id, 
    'Bupo' 
FROM 
    map_tags mt 
WHERE 
    mt.map_license = '12345' 
+1

他のものとほとんど同じですが、完全ではなく、1分後の回答がより多く投票され、受け入れられましたか? –

関連する問題