我试图创建一个函数
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
检索update
和id
;否则只需做一个简单的INSERT
。
现在我的问题:除了我现在正在做的事情之外,还有其他方法可以做2 sql
个陈述吗?
编辑1
附录:
有一个自动递增的索引。 要插入的所有值都是唯一的
我宁愿不改变索引,因为它在另一个表中被引用..
答案 0 :(得分:5)
如果表中包含AUTO_INCREMENT
列且INSERT ... UPDATE
插入一行,则LAST_INSERT_ID()
函数将返回AUTO_INCREMENT
值。如果该语句更新了一行,则LAST_INSERT_ID()
无意义。但是,您可以使用LAST_INSERT_ID(expr)
解决此问题。假设id
是AUTO_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
答案 1 :(得分:0)
万一有人从谷歌出现在这里,我遇到了ON DUPLICATE KEY UPDATE
一直触发相同错误值的问题。
当插入只有名字和姓氏的用户时,它没有AUTO_INCREMENT
主键。原因是我们有一个users
表,其中包含对用户名的唯一约束,但它的默认值为''
。因此,当您插入没有用户名的用户时,它会触发它以更新该用户名的重复值,并且随机帐户将继续作为正确的帐户返回。
解决方案是确保只有NULL
是表中唯一键的默认值,该表还具有单独的自动增量主键,或者确实为唯一约束生成唯一值