mySQL和LAST_INSERT_ID问题

时间:2009-07-31 08:58:26

标签: mysql triggers

我有一个DB-Application,现在我们必须从复制开始(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代码的情况下解决这个问题?

greatings。

2 个答案:

答案 0 :(得分:1)

我假设你试图避免在两个主人上插入相同的ID。

这样做的一种方法(假设2个主人)是将auto_increment_increment设置为2,将auto_increment_offset设置为0,一个主设备设置为0,将1设置为另一个设备。

这会导致每个母版上的ID不能与另一个母版发生碰撞。

除此之外:使用bigint和随机UUID,由于生日悖论,您当前的方法可能会在30亿行左右发生碰撞。

答案 1 :(得分:0)

与大多数其他数据库服务器技术相比,mysql中LAST_INSERT_ID与触发器相关的行为实际上非常“不标准”。但我发现它更安全,更容易使用。

无论如何,你的问题没有一个明确的答案,因为复制总是很复杂。但user83591的答案足以为大多数情况提供解决方案。生日悖论的概念也非常到位。你应该接受这个作为答案。