【发布时间】:2015-05-16 10:21:09
【问题描述】:
我已经为此花费了 24 小时,并且需要利用现有知识来速战速决。
我有这个mysql函数:
DELIMITER $$
USE `db`$$
DROP FUNCTION IF EXISTS `insertindb`$$
CREATE DEFINER=`root`@`localhost` FUNCTION `insertindb`(itemtype VARCHAR(10), dname VARCHAR (50), id INTEGER, fname VARCHAR(50), lname VARCHAR(50)) RETURNS INT(11)
DETERMINISTIC
BEGIN
DECLARE ret INT;
DECLARE ret2 INT;
IF itemtype = 'state' THEN
INSERT IGNORE INTO state (`name`) VALUES (dname);
SELECT LAST_INSERT_ID() INTO ret;
IF ret = 0 THEN
SELECT `id` INTO ret2 FROM state WHERE `name` LIKE dname;
SET ret = ret2;
END IF;
END IF;
RETURN ret;
END$$
DELIMITER ;
目标?当state 表中已经存在一个状态时,它应该返回 id 列(这是自动增量键)。当它不存在时,它应该插入它并返回新(自动)分配的id。
该功能正在运行,但做了两件我不想要的事情:
1) 当记录已经存在时,它返回零而不是现有记录的id。我的代码旨在解决这个问题,但它不起作用请注意我在表上定义了一个索引以确保 state.name 在表中是唯一的,以便 INSERT IGNORE 工作
2) LAST_INSERT_ID() 即使在记录存在且没有插入任何内容的情况下也会不断增加。因此,例如,如果状态表只有一条记录开头(比如 id==>1,name ==> 'State A',),如果我调用该函数 2 次尝试重新插入 'State A'(其中不会像上面第 1 点中提到的那样插入)然后再次调用它来插入“状态 B”,该表现在将有第二条记录 id==>4,name ==>“状态 B”跳过 id 值 2 和 3 . 有没有办法让 LAST_INSERT_ID 以不同的方式工作?
我现在的代码
BEGIN
DECLARE ret,ret2 INT;
IF itemtype = 'state' THEN
SELECT `id` INTO ret FROM state WHERE `name` LIKE dname;
#insert into debug (dump1,dump2) values ('ret will be',ret);
IF ret IS NULL OR ret = '' THEN
INSERT IGNORE INTO state (`name`) VALUES (dname);
SELECT LAST_INSERT_ID() INTO ret2;
#SELECT `id` INTO ret FROM state WHERE `name` LIKE dname;
RETURN ret2;
ELSE
RETURN ret;
END IF;
END IF;
结束$$
【问题讨论】:
标签: mysql last-insert-id