2009-07-31 102 views
0

我有一個數據庫應用程序,現在我們必須從複製(主 - 主複製)開始。 我們構建一個存儲函數的女巫返回一個BIGINT。此值在所有涉及的服務器上都是唯一的。mySQL和LAST_INSERT_ID問題

的情況: 我有一個表定義:

create table test (
id BIGINT not null primary key auto_increment, 
col1 TEXT); 

表有一個INSERT觸發器之前:

CREATE TRIGGER test_insert BEFORE INSERT ON test 
FOR EACH ROW BEGIN 
    IF NEW.id = 0 THEN 
    SET @my_uuid = MYUUID(); 
    SET NEW.id = @my_uuid; 
    END IF; 
END; 

插入操作測試(COL1)後的值( 「富」)我需要LAST_INSERT_ID()的值 - 但我只能得到值「0」。

我在扳機try'd這樣的:

SET NEW.id = LAST_INSERT_ID(@my_uuid); 

但鴕鳥政策工作。

我讀了mysql的手冊頁女巫說,觸發器和函數內的last_insert_id的所有更改都將在觸發器結束時被取消。

所以我會盡量避免更改應用程序(女巫使用php.last_insert_id())...

任何想法如何解決這個問題不改變的PHP代碼?

greatings。

回答

1

我假設你試圖避免在兩個主結束時插入相同的ID。要做到這一點

單程(假設2個主站)是設置auto_increment_increment爲2,auto_increment_offset至0上的一個主站,和1上的其他。

這將導致每個主機上的ID不會與另一個主機發生衝突。另外:隨着bigint和隨機UUIDs,由於生日悖論,你目前的方法可能會碰撞約30億行。

0

與大多數其他數據庫服務器技術相比,mysql中LAST_INSERT_ID與觸發器的行爲實際上相當「不規範」。但我發現它更安全,更容易合作。

無論如何,沒有人明確回答你的問題,因爲複製總是很複雜。但user83591的答案足以爲大多數情況提供解決方案。生日悖論的概念也非常到位。你應該接受這個答案。