我有一个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。
答案 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
的答案足以为大多数情况提供解决方案。生日悖论的概念也非常到位。你应该接受这个作为答案。