使用last_insert_id()插入DUPLICATE KEY UPDATE

时间:2012-11-29 10:05:40

标签: mysql stored-functions

我试图创建一个函数

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检索updateid;否则只需做一个简单的INSERT

现在我的问题:除了我现在正在做的事情之外,还有其他方法可以做2 sql个陈述吗?

编辑1

附录:

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

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

2 个答案:

答案 0 :(得分:5)

如果表中包含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

答案 1 :(得分:0)

万一有人从谷歌出现在这里,我遇到了ON DUPLICATE KEY UPDATE一直触发相同错误值的问题。

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

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