簡體   English   中英

mySQL和LAST_INSERT_ID問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM