Mysql 使用最后一个插入id()进行重复密钥更新时插入
我正在尝试创建一个函数Mysql 使用最后一个插入id()进行重复密钥更新时插入,mysql,stored-functions,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 la
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\u insert\u id()
,如果函数要插入,则返回的值是正确的;否则,如果函数更新,则返回的值是不可预测的
我知道解决这个问题的替代方法是使用单独的选择
,并确定它是否存在;如果存在,则检索id
并使用该id
更新;否则,只需执行简单的插入操作
现在我的问题是:除了执行2个sql
语句之外,还有其他方法可以替代我现在所做的吗
编辑1
增编:
有一个自动递增的索引。
所有要插入的值都是唯一的
我不想更改索引,因为它在另一个表中引用。如果一个表包含自动增量列和插入。。。UPDATE
插入一行,LAST\u INSERT\u ID()
函数返回AUTO\u INCREMENT
值。如果语句改为更新一行,LAST\u INSERT\u ID()
没有意义。但是,您可以使用LAST\u INSERT\u ID(expr)
解决此问题。假设id
是AUTO_INCREMENT
列。要使LAST\u INSERT\u ID()
对更新有意义,请按如下方式插入行:
INSERT INTO table (a, b, c) VALUES (1, 2, 3)
ON DUPLICATE KEY UPDATE id = LAST_INSERT_ID(id), c = 3;
在这上面找到的。虽然我从未试过,但它可能对你有帮助
编辑1
您可能想签出:
这适用于具有正确的主键的表
/唯一索引
最后,你只需坚持:
IF (VALUES EXISTS ON TABLE ...)
UPDATE ...
SELECT Id;
ELSE
INSERT ...
RETURN last_insert_id();
END IF
为了防止有人从谷歌出现在这里,我遇到了一个问题,在重复密钥更新时,不断触发相同的错误值
当插入只有名字和姓氏的用户时,它不会自动递增主键。原因是我们有一个users
表,对用户名有唯一的约束,但它的默认值是'
。因此,当您插入一个没有用户名的用户时,它会触发该用户更新该用户名的重复值,并且该随机帐户会一直作为正确的帐户返回
解决方案是确保只有NULL
是表中唯一键的默认值,该表也有单独的自动递增主键,或者您确实为唯一约束生成了唯一值。它工作得非常好。我一直用这种方法。唯一值得考虑的是,当依赖于非增量列的唯一列时,id的增量可能会表现得很奇怪。然而,当你说到这一点时,还有其他可靠的方法来解决这个问题。我总是有那种奇怪的Id
增量,有时它们会有间隙。感谢您指出@robincastlin请查看附录:D@KaeL我已经搜索了足够长的时间,得出结论,没有适合该解决方案的1行sql语句解决方案;相反,单独的select
insert或update更容易出现with@ianace:你试过上面的查询吗?根据链接,它适用于包含id
的AUTO_INCREMENT
列的表。请提供SHOW CREATE TABLE。第1列、第2列、第3列中哪一列是唯一的?在对公认答案的第一次评论中指出了可能的重复。不,不是。我遇到的问题是默认值被设置为字符串而不是null。这触发了主键的更新,即使它不应该。第一条评论是:唯一值得考虑的是,当依赖于非增量列的唯一列时,id的增量可能会表现得很奇怪。然而,当你达到这一点时,还有其他可靠的方法来解决它。
这绝对不能解释这是如何导致问题的。
IF (VALUES EXISTS ON TABLE ...)
UPDATE ...
SELECT Id;
ELSE
INSERT ...
RETURN last_insert_id();
END IF