[英]mySQL and LAST_INSERT_ID issues
我有一個數據庫應用程序,現在我們必須從復制開始(master-master-replication)。 我們構建了一個存儲函數,該函數返回一個BIGINT。 此值在所有涉及的服務器上都是唯一的。
情況:我有一個表定義:
create table test (
id BIGINT not null primary key auto_increment,
col1 TEXT);
該表具有插入前觸發器:
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)值(“ foo”)之后,我需要LAST_INSERT_ID()的值-但我只得到值“ 0”。
我在觸發器中嘗試過此操作:
SET NEW.id = LAST_INSERT_ID(@my_uuid);
但這不起作用。
我閱讀了mysql手冊,其中指出,觸發器和函數中對last_insert_id的所有更改都將在觸發器結束時被取消。
所以我盡量避免更改應用程序(使用php.last_insert_id())...
任何想法如何解決這一問題而無需更改php代碼?
賀禮。
我假設您正在嘗試避免在以相同ID結尾的兩個母版上插入。
一種方法(假設有2個主機)是將auto_increment_increment
設置為2,將一個主機的auto_increment_offset
為0,將另一個主機設置為1。
這將導致每個主機上的ID不能相互沖突。
撇開:使用bigint和隨機UUID,由於生日悖論,您當前的方法可能會發生約30億行沖突。
與大多數其他數據庫服務器技術相比,mysql中LAST_INSERT_ID
與觸發器有關的行為實際上是“非標准的”。 但是我發現它更安全,更容易使用。
無論如何,對於您的問題,沒有一個明確的答案,因為復制總是很復雜。 但是user83591
的答案足以為您提供大多數情況下的解決方案。 生日悖論的概念也很到位。 您應該接受它作為答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.