【问题标题】:INSERT INTO with SubQuery MySQL使用子查询 MySQL 插入 INTO
【发布时间】:2012-05-25 12:39:28
【问题描述】:

我有这个声明:

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

我该如何解决这个问题?

【问题讨论】:

    标签: mysql insert subquery


    【解决方案1】:

    作为 Michael Berkowski 良好答案的旁注: 您还可以像这样动态添加字段(或者如果您正在使用 php 脚本,请准备好它们):

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

    如果需要在不添加新数据的情况下进行传输,可以使用NULL作为占位符。

    【讨论】:

      【解决方案2】:

      我对“全有或全无”的答案感到失望。我需要(再次)从现有表中获取INSERT 一些数据和SELECT id

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

      INSERT 查询上的子选择应使用括号和逗号作为分隔符。

      对于那些在INSERT 中使用SELECT 时遇到问题的人,我建议先独立测试您的SELECT,并确保两个查询的正确列数匹配。

      【讨论】:

        【解决方案3】:

        你可以简单地例如

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

        【讨论】:

        • Error in query (1242): Subquery returns more than 1 row -> 语法正确,但仅适用于单行。
        • 在使用像答案这样的子查询时,总是最好设置一个限制状态。例如:从 title="Top bar" 限制为 1 的模块中选择 id
        【解决方案4】:

        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 中,您需要别名才能访问返回的列。

        【讨论】:

          【解决方案5】:

          您的插入语句左侧的列过多或右侧的列不足。 VALUES 之前的部分列出了 7 列,而 VALUES 之后的第二部分仅返回 3 列:1、2,则子查询仅返回 1 列。

          编辑:好吧,在有人修改查询之前就已经这样做了......

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-03-29
            • 2018-09-16
            • 2015-01-03
            • 1970-01-01
            • 2016-03-25
            • 1970-01-01
            • 2013-01-27
            相关资源
            最近更新 更多