使用last_insert_id()插入DUPLICATE KEY UPDATE

ian*_*ace 2 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
Run Code Online (Sandbox Code Playgroud)

如果它不存在,则会在表中插入一行,否则会更新它.请注意,last_insert_id()如果函数将插入则返回哪个是正确的,否则在更新时将是不可预测的.

我知道解决这个问题的另一种方法是使用单独的方法SELECTS并确定它是否存在; 如果存在则检索idupdate使用它id; 否则只是做一个平原INSERT.

现在我的问题是:除了sql我现在正在做的事情之外,还有其他两种做法的替代方案吗?

编辑1

附录:

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

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

Kae*_*aeL 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;
Run Code Online (Sandbox Code Playgroud)

在此链接上找到它.我从来没有尝试过,但它可能对你有帮助.

编辑1

您可能想要查看REPLACE:

REPLACE INTO table1 (column1, column2, column3) VALUES (param1, param2, param3);
Run Code Online (Sandbox Code Playgroud)

这适用于表格正确PRIMARY KEY/ UNIQUE INDEX.

最后,你必须坚持:

IF (VALUES EXISTS ON TABLE ...)
    UPDATE ...
    SELECT Id;
ELSE
    INSERT ...
    RETURN last_insert_id();
END IF
Run Code Online (Sandbox Code Playgroud)

  • 它的工作非常棒.我一直都在使用这种方法.唯一值得考虑的是,当依赖不是增量列的UNIQUE列时,你的id的增量可能会很奇怪.但是,当你达到这一点时,还有其他可靠的方法来解决它. (2认同)