gpt4 book ai didi

mysql - 使用 last_insert_id() 插入重复键更新

转载 作者:行者123 更新时间:2023-11-29 01:30:49 24 4
gpt4 key购买 nike

我正在尝试创建一个函数

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 并使用该 id update;否则只做一个普通的INSERT

现在我的问题是:除了执行 2 个 sql 语句与我现在正在执行的操作相比,是否有任何替代方法?

编辑 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

关于mysql - 使用 last_insert_id() 插入重复键更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13623258/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com