【问题标题】:INSERT ON DUPLICATE KEY UPDATE with last_insert_id()使用 last_insert_id() 插入重复的密钥更新
【发布时间】:2012-11-17 09:03:44
【问题描述】:

我正在尝试创建一个函数

CREATE FUNCTION `func`(param1 INT, param2 INT, param3 TEXT) RETURNS int(11)
BEGIN
INSERT INTO `table1` (`column1`, `column2`, `column3` ) 
VALUES (param1, param2, param3)
ON DUPLICATE KEY 
UPDATE `time_stamp` = UNIX_TIMESTAMP();
RETURN last_insert_id();
END

如果它不存在,这将在表中插入一行,否则更新它。 请注意,我返回了last_insert_id(),如果函数插入,这将是正确的,否则如果它更新,则将是不可预测的。

我知道解决此问题的替代方法是使用单独的SELECTS 并确定它是否存在;如果存在,则使用该id 检索idupdate;否则就做一个普通的INSERT

现在我的问题是:除了我现在正在做的事情之外,还有什么可以替代做 2 个sql 语句的方法吗?

编辑 1

附录:

有一个自动递增的索引。 要插入的所有值都是唯一的

我宁愿不更改索引,因为它在另一个表中被引用..

【问题讨论】:

标签: mysql stored-functions


【解决方案1】:

如果表包含AUTO_INCREMENT 列并且INSERT ... UPDATE 插入一行,则LAST_INSERT_ID() 函数将返回AUTO_INCREMENT 值。如果语句改为更新一行,LAST_INSERT_ID()没有意义。但是,您可以使用LAST_INSERT_ID(expr)解决此问题。假设idAUTO_INCREMENT 列。要使 LAST_INSERT_ID() 对更新有意义,请按如下方式插入行:

INSERT INTO table (a, b, c) VALUES (1, 2, 3)
  ON DUPLICATE KEY UPDATE id = LAST_INSERT_ID(id), c = 3;

link 上找到它。虽然我从未尝试过,但它可能会对你有所帮助。

编辑 1

您可能想查看REPLACE

REPLACE INTO table1 (column1, column2, column3) VALUES (param1, param2, param3);

这应该适用于具有正确PRIMARY KEY/UNIQUE INDEX 的表。

最后,你只需要坚持:

IF (VALUES EXISTS ON TABLE ...)
    UPDATE ...
    SELECT Id;
ELSE
    INSERT ...
    RETURN last_insert_id();
END IF

【讨论】:

  • 效果很好。我一直使用这种方法。唯一值得考虑的是,当依赖不是增量一的 UNIQUE 列时,您的 id 增量可能会表现得很奇怪。但是,当您达到这一点时,还有其他可靠的方法可以解决它。
  • 我总是有 Id 的奇怪增量,有时它们有差距。感谢您指出@RobinCastlin
  • 请查看附录:D
  • @KaeL 我已经搜索了足够长的时间来得出结论,该解决方案没有 1 线性 sql 语句解决方案;相反,单独的 select 插入或更新更容易提出
  • @ianace:你试过上面的查询吗?根据该链接,它适用于包含idAUTO_INCREMENT 列的表。
【解决方案2】:

以防万一有人从 Google 出现在这里,我遇到了一个问题,ON DUPLICATE KEY UPDATE 不断触发相同的错误值。

当插入一个只有名字和姓氏的用户时,它没有AUTO_INCREMENT 主键。原因是我们有一个users 表,它对用户名有唯一约束,但它的默认值是''。因此,当您插入一个没有用户名的用户时,它会触发它更新该用户名的重复值,并且该随机帐户会一直作为正确的帐户返回。

解决方案是确保只有 NULL 是表中唯一键的默认值,该表还具有单独的自动增量主键,或者您确实为唯一约束生成唯一值。

【讨论】:

  • 这是在对已接受答案的第一条评论中指出的
  • 不,不是。我遇到的问题是将默认值设置为字符串而不是 null。即使它不应该触发主键的更新,它也会触发更新。第一条评论是:Only thing worth considering is that your id's increment may act strange when relying on UNIQUE columns that isn't the increment one. However, when you get to that point, there are other reliable ways to solve it. 这绝对不是对这如何导致问题的解释。
猜你喜欢
  • 2011-09-08
  • 2017-10-17
  • 2021-11-11
  • 1970-01-01
  • 1970-01-01
  • 2014-10-31
  • 1970-01-01
  • 2018-06-24
相关资源
最近更新 更多