Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用最后一个插入id()进行重复密钥更新时插入_Mysql_Stored Functions - Fatal编程技术网

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