【问题标题】:MySQL INSERT on duplicate key UPDATE with SELECTMySQL INSERT 重复键 UPDATE 与 SELECT
【发布时间】:2013-07-12 09:53:28
【问题描述】:

我有如下查询

INSERT INTO connections (`c_id`,`in`,`out`,`ip`,`userID`) 
VALUES ( 
    ( 
        SELECT c_id 
        FROM connections 
        WHERE (a bunch of conditions) 
        ORDER BY c_id DESC LIMIT 1 

    ),
    '1373799802',
    0,
    INET_ATON('127.0.0.1'),
    4

) 
ON DUPLICATE KEY UPDATE `out` = 1

这会引发以下错误

1093 - 您不能在 FROM 子句中指定目标表“连接”进行更新

显然我不能在insert into on duplicate update 语法中使用 SELECT 子句,但我真的更愿意这样做,而不是运行 2 个查询。谁能告诉我该怎么做?

【问题讨论】:

标签: mysql select on-duplicate-key


【解决方案1】:

试试这样吧:

INSERT INTO connections (`c_id`,`in`,`out`,`ip`,`userID`) 
VALUES ( 
    ( 
SELECT p.c_id 
        FROM (select * from connections) p 
        WHERE (a bunch of conditions) 
        ORDER BY p.c_id DESC LIMIT 1 

    ),
    '1373799802',
    0,
    INET_ATON('127.0.0.1'),
    4

) 
ON DUPLICATE KEY UPDATE `out` = 1

这个问题似乎是由于 mysql 版本 4.1.7 中的一个错误造成的,该错误指出

you can't update the same table which you use in the SELECT part

Here

不确定这是否与您使用的版本相同。

【讨论】:

    【解决方案2】:

    试试这个

        INSERT INTO connections (`c_id`,`in`,`out`,`ip`,`userID`) 
        SELECT c_id ,'1373799802', 0, INET_ATON('127.0.0.1'),4
        FROM connections 
        WHERE (a bunch of conditions) 
        ORDER BY c_id DESC LIMIT 1 
    
        ON DUPLICATE KEY UPDATE `out` = 1
    

    【讨论】:

      【解决方案3】:

      查询中的以下代码:

      SELECT c_id 
      FROM connections 
      WHERE (a bunch of conditions) 
      ORDER BY c_id DESC
      LIMIT 1 
      

      实际上会生成一个表格而不是单个值。要成功尝试,请尝试以下操作:

      INSERT INTO connections (`c_id`,`in`,`out`,`ip`,`userID`) 
          SELECT  c_id,
                  '1373799802',
                  0,
                  INET_ATON('127.0.0.1'),
                  4
          FROM connections 
          WHERE (a bunch of conditions) 
          ORDER BY c_id DESC LIMIT 1 
      ON DUPLICATE KEY 
      UPDATE `out` = 1
      

      【讨论】:

      • 当我只选择一列并且限制为1个结果时,为什么第一个查询结果是一个表?另外,您能否解释一下为什么我必须将所有值作为 select 子句的结果集,而不是我如何编写它?
      • 如果不满足条件,这似乎也不会添加新行:/
      猜你喜欢
      • 1970-01-01
      • 2011-03-18
      • 1970-01-01
      • 2011-08-09
      • 2016-06-05
      • 1970-01-01
      • 1970-01-01
      • 2015-07-30
      • 1970-01-01
      相关资源
      最近更新 更多