【发布时间】:2009-11-11 16:46:25
【问题描述】:
我是一家为我的 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 更新呢?
谢谢!
【问题讨论】:
-
什么是“常见问题”?我以前从未听说过。
-
一点更正:当然,在代码中,@@auto_increment_increment 将被一些常数替换——在我的例子中——替换为 1。这个解决方案是针对更一般的问题(如何实现序列) .
标签: mysql concurrency auto-increment sequences