2009-11-11 236 views
1

我是某個主機公司的用戶,它服務於我的MySql數據庫。由於其複製問題,自動增量值增加10,這似乎是一個常見問題。MySql自動增量列增加10個問題

我的問題是如何模擬(安全地)自動增量功能,以便該列有連續的ID?

我的想法是實現一些順序機制來解決我的問題,但我不知道它是否是一個最佳選擇。我在網上發現了這樣的代碼snipset:

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:[email protected]@auto_increment_offset)[email protected]@auto_increment_increment 
    ON DUPLICATE KEY 
    UPDATE `value`=(@val:=`value`)[email protected]@auto_increment_increment; 
    RETURN @val; 
END ;; 

DELIMITER ; 

這似乎完全正確。我的第二個問題是,如果這個解決方案是併發安全的?當然,INSERT語句是,但是關於ON DUPLICATE KEY更新呢?

謝謝!

+0

什麼是「常見問題」?我從來沒有聽說過這個。 – longneck 2009-11-11 17:08:24

+0

糾正:當然,在代碼中,@@ auto_increment_increment將被一些常量(在我的情況下)替換爲1.此解決方案用於更一般的問題(如何實現序列)。 – vnx 2009-11-11 17:18:28

回答

6

爲什麼你需要把它放在第一位?

即使使用auto_increment_increment == 1,也不保證表格中的自動增量字段將具有連續值(如果行被刪除,嗯?)。

有了自動增量功能,您只需通過數據庫引擎就能保證該字段是唯一的,沒有別的,真的。

編輯:我想重申:在我看來,這是不是一個好主意,承擔的東西就像一個自動增量列的值,同時,因爲它是後來咬你。

EDIT2:無論如何,這可以通過「開刀片」觸發

create trigger "sequence_b_ins" before insert on `sequence` 
for each row 
begin 
    NEW.id = select max(id)+1 from `sequence`; 
end 

還是什麼沿着這些線路(對不起,未測試)

+0

是的,你說得對。我不依賴於這個自動增量列的連貫性,但是對於我的客戶來說,讓這個數字「幾乎總是」連續是有用的。 – vnx 2009-11-11 16:54:56

+1

那麼,在我的書中,「幾乎總是」的意思,基本上是「從不」。這並非總是如此,但對於這種特殊情況,我認爲(當然)是這樣。 – shylent 2009-11-11 16:57:49

+0

感謝您的回覆,我會考慮您的話,重新考慮我的問題。 – vnx 2009-11-11 17:25:51

0

另一種選擇是使用「解決」存儲過程執行插入操作,並使其從您的表中選擇最大ID或使用正在使用的當前ID保留另一個表,並使用id進行更新。

+0

對,這是我的問題的第二部分。如果附加的代碼是併發安全的,你能給我一個提示嗎?這對我來說是一個問題。 – vnx 2009-11-11 16:56:34