MySql自动增量列增加了10个问题

时间:2009-11-11 16:46:25

标签: mysql concurrency auto-increment sequences

我是某个主机公司的用户,该公司为我的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更新呢?

谢谢!

2 个答案:

答案 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。