3

我试图创建一个函数

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并确定它是否存在;如果存在,则检索idupdate使用它id;否则就做一个普通的INSERT.

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

编辑 1

附录:

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

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

4

2 回答 2

6

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

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

编辑 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
于 2012-11-29T10:41:26.083 回答
0

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

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

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

于 2016-12-07T04:12:40.880 回答