web-dev-qa-db-ja.com

SubQuery MySQLを使用したINSERT INTO

私はこの声明を持っています:

INSERT INTO qa_costpriceslog (item_code, invoice_code, item_costprice)
    VALUES (1, 2, (SELECT item_costprice FROM qa_items WHERE item_code = 1));

Item_costpriceの同じデータをコピーして値を挿入しようとしていますが、エラーが表示されます。

Error Code: 1136. Column count doesn't match value count at row 1

これをどのように解決できますか?

48
John Nuñez

SELECTステートメント内でエイリアスを持つ数値リテラルを使用します。 SELECTコンポーネントの周りに()は必要ありません。

INSERT INTO qa_costpriceslog (item_code, invoice_code, item_costprice)
  SELECT
    /* Literal number values with column aliases */
    1 AS item_code,
    2 AS invoice_code,
    item_costprice
  FROM qa_items 
  WHERE item_code = 1;

INSERT INTO...SELECTのコンテキストでは、エイリアスは実際には必要なく、SELECT 1, 2, item_costpriceだけでよいことに注意してください。ただし、通常のSELECTでは、返される列にアクセスするためにエイリアスが必要です。

82

あなたは単に例えば.

INSERT INTO modulesToSections (fk_moduleId, fk_sectionId, `order`) VALUES
    ((SELECT id FROM modules WHERE title="Top bar"),0,-100);
7
Elendurwen

挿入ステートメントの左側の列が多すぎるか、右側の列が不足しています。 VALUESの前の部分には7つの列がリストされていますが、VALUESの後の2番目の部分には3つの列しか返されません:1、2の場合、サブクエリは1つの列のみを返します。

編集:さて、誰かがクエリを変更する前に...

3

「すべてか無か」という答えに失望しました。 (もう一度)INSERTいくつかのデータとSELECTと既存のテーブルからのidが必要でした。

INSERT INTO table1 (id_table2, name) VALUES ((SELECT id FROM table2 LIMIT 1), 'Example');

INSERTクエリの副選択では、区切り文字としてコンマに加えて括弧を使用する必要があります。

SELECT内でINSERTを使用することに問題がある場合は、最初にSELECTを個別にテストし、両方のクエリで正しい列数が一致することを確認することをお勧めします。

0
John