使用SubQuery MySQL插入INTO

时间:2012-05-17 22:04:55

标签: mysql insert subquery

我有这个声明:

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

我如何解决这个问题?

5 个答案:

答案 0 :(得分:78)

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中,您需要使用别名来访问列返回。

答案 1 :(得分:6)

你可以简单地说。

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

答案 2 :(得分:3)

您的insert语句在左侧包含太多列,或在右侧没有足够的列。 VALUES之前的部分列出了7列,但VALUES之后的第二部分只返回了3列:1,2,那么子查询只返回1列。

编辑:嗯,在有人修改了查询之前就已经做了....

答案 3 :(得分:0)

我对“全有还是全无”的答案感到失望。我需要(再次)从现有表中INSERT一些数据和SELECTid

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

INSERT查询中的子选择除了使用逗号作为分隔符外,还应使用括号。

对于那些在SELECT中使用INSERT有困难的人,建议您首先独立测试SELECT,并确保两个查询的正确列数均匹配。

答案 4 :(得分:0)

作为迈克尔·伯科夫斯基(Michael Berkowski)好的回答的补充说明: 您还可以像这样动态添加字段(或在使用php skripts时进行准备):

   INSERT INTO table_a(col1, col2, col3)
     SELECT
       col1,
       col2,
       CURRENT_TIMESTAMP()
     FROM table_B 
     WHERE b.col1 = a.col1;

如果您需要传输而不添加新数据,则可以使用NULL作为占位符。