ian*_*ace 2 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 last_insert_id();
END
Run Code Online (Sandbox Code Playgroud)
如果它不存在,则会在表中插入一行,否则会更新它.请注意,last_insert_id()如果函数将插入则返回哪个是正确的,否则在更新时将是不可预测的.
我知道解决这个问题的另一种方法是使用单独的方法SELECTS并确定它是否存在; 如果存在则检索id并update使用它id; 否则只是做一个平原INSERT.
现在我的问题是:除了sql我现在正在做的事情之外,还有其他两种做法的替代方案吗?
编辑1
附录:
有一个自动递增的索引.要插入的所有值都是唯一的
我宁愿不改变索引,因为它被引用到另一个表中.
如果表包含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;
Run Code Online (Sandbox Code Playgroud)
在此链接上找到它.我从来没有尝试过,但它可能对你有帮助.
编辑1
您可能想要查看REPLACE:
REPLACE INTO table1 (column1, column2, column3) VALUES (param1, param2, param3);
Run Code Online (Sandbox Code Playgroud)
这适用于表格正确PRIMARY KEY/ UNIQUE INDEX.
最后,你必须坚持:
IF (VALUES EXISTS ON TABLE ...)
UPDATE ...
SELECT Id;
ELSE
INSERT ...
RETURN last_insert_id();
END IF
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6881 次 |
| 最近记录: |