【问题标题】:Why does this SQL "UPSERT" affect two rows?为什么这个 SQL“UPSERT”会影响两行?
【发布时间】:2018-02-27 20:30:46
【问题描述】:

我试图写一个 upsert,当我按顺序运行这两个查询时:

// The numbers here are arbitrary, but id matches one already existing in db. 
SET @id = 1069, @exportid = null, @photoid = 11223344;

INSERT INTO student (id_number, exportid, photoid) VALUES (@id, @exportid, @photoid)
  ON DUPLICATE KEY UPDATE exportid = @exportid, photoid = @photoid;

它会更新并进行一些更改,我得到“2 行受影响”。为什么它不只是一个(如果它命中插入,我会按预期影响 1 行)?

表的 CREATE 语句,有一堆非键列被编辑:

CREATE TABLE  `demo`.`student` (
  `id_number` varchar(15) NOT NULL DEFAULT '',
  `exportid` varchar(20) DEFAULT NULL,
  `photoid` varchar(25) DEFAULT NULL,
   PRIMARY KEY (`id_number`),
  KEY `EXPORTID` (`exportid`),
  KEY `NAME` (`last_name`,`student`,`id_number`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

【问题讨论】:

  • 你的桌子上有多个唯一键吗?
  • @Uueerdo 我的错。我之前指定了 id_number 来引用一个特定的 id。让我编辑帖子。
  • 你是如何创建表格的? id_number 是主键/唯一键吗?
  • @Sirmyself 是的,它是主要的。

标签: mysql sql


【解决方案1】:

如果使用 ON DUPLICATE KEY UPDATE,每行的受影响行值为 1,如果 该行作为新行插入,如果现有行被更新,则为 2,并且 如果将现有行设置为其当前值,则为 0。

来自official docs

【讨论】:

    猜你喜欢
    • 2011-08-02
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 2011-06-17
    • 2023-03-03
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    相关资源
    最近更新 更多