我是某个主机公司的用户,该公司为我的MySql数据库提供服务。由于它们的复制问题,自动增量值增加10,这似乎是一个常见问题。
我的问题是如何模拟(安全)自动增量功能,以便列具有连续的ID?
我的想法是实现一些序列机制来解决我的问题,但我不知道它是否是最好的选择。我在网上找到了这样的代码片段:
DELIMITER ;;
DROP TABLE IF EXISTS `sequence`;;
CREATE TABLE `sequence` (
`name` CHAR(16) NOT NULL,
`value` BIGINT UNSIGNED NOT NULL,
PRIMARY KEY (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;;
DROP FUNCTION IF EXISTS `nextval`;
CREATE FUNCTION `nextval`(thename CHAR(16) CHARSET latin1)
RETURNS BIGINT UNSIGNED
MODIFIES SQL DATA
SQL SECURITY DEFINER
BEGIN
INSERT INTO `sequence`
SET `name`=thename,
`value`=(@val:=@@auto_increment_offset)+@@auto_increment_increment
ON DUPLICATE KEY
UPDATE `value`=(@val:=`value`)+@@auto_increment_increment;
RETURN @val;
END ;;
DELIMITER ;
这似乎完全正确。我的第二个问题是这个解决方案是否兼并安全?当然是INSERT语句,但是ON DUPLICATE KEY更新呢?
谢谢!
答案 0 :(得分:6)
为什么你需要首先拥有它?
即使auto_increment_increment
== 1,也无法保证,表格中的自动增量字段将具有连续值(如果行被删除,嗯?)。
使用自动增量,你只需要db引擎保证,该字段将是唯一的,没有别的,真的。
编辑:我想重申一下:在我看来,不是一个好主意,可以假设像自动增量列的并发值这样的事情,因为它 会去以后咬你。
EDIT2:无论如何,这可以通过“插入”触发器“解决”
create trigger "sequence_b_ins" before insert on `sequence`
for each row
begin
NEW.id = select max(id)+1 from `sequence`;
end
或者这些内容(对不起,未经测试)
答案 1 :(得分:0)
另一种选择是使用存储过程来执行插入操作,并让它从表中选择max id或保留另一个表,其中使用当前id并使用更新为id。