挑战:
创建一个方法,以非顺序方式为表设置“自动增量”值。目标是重写“auto\u increment”机制,并允许函数“last\u insert\u id()”继续按预期工作(返回int),这样就不需要在软件端进行任何更改。
我的解决方案
我找到的方法基于一个辅助表(unique\ id),它存储可分配的值。然后随机选择值,并将其从表中删除。当表为空时,将创建一组新的id。
这个例子和预期的一样,但是有一个问题。演示表格:
CREATE TABLE `unique_id` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
AUTO_INCREMENT=100;
CREATE TABLE `test_unique_id` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
AUTO_INCREMENT=1;
定义了存储过程和函数:
DELIMITER $$
DROP PROCEDURE IF EXISTS `UNIQUE_ID_REFILL`$$
CREATE PROCEDURE UNIQUE_ID_REFILL()
BEGIN
DECLARE a INT Default 0 ;
simple_loop: LOOP
SET a=a+1;
INSERT INTO unique_id (id) values(null);
IF a=100 THEN
LEAVE simple_loop;
END IF;
END LOOP simple_loop;
END $$
DROP FUNCTION IF EXISTS `UNIQUE_ID_GET`$$
CREATE FUNCTION UNIQUE_ID_GET()
RETURNS INT(11)
MODIFIES SQL DATA
BEGIN
DECLARE new_id INT(11);
DECLARE unique_id_count INT(11);
SET new_id = 0;
SELECT COUNT(*) INTO unique_id_count FROM unique_id;
IF unique_id_count=0 THEN
CALL UNIQUE_ID_REFILL();
END IF;
SELECT id INTO new_id FROM unique_id ORDER BY RAND() LIMIT 1;
DELETE FROM unique_id WHERE id = new_id;
RETURN new_id;
END $$
在目标表(test\u unique\u id)上创建了触发器:
CREATE TRIGGER test_unique_id__unique_id BEFORE INSERT ON test_unique_id
FOR EACH ROW
SET NEW.id = UNIQUE_ID_GET();
解决方案是按预期获得随机id:
INSERT INTO test_unique_id(name) VALUES ('A'),('B'),('C');
创建行:
id name
154 'A'
129 'B'
173 'C'
问题
主要问题是最后一个插入id()停止工作。。。软件方面也坏了:
SELECT LAST_INSERT_ID();
0
有什么办法解决这个问题吗?或者其他不同的挑战方法?
非常感谢你。
暂无答案!
目前还没有任何答案,快来回答吧!