我有一个DB-Application,现在我们必须开始复制(master-master- replication )。我们构建一个存储函数,它返回一个BIGINT。该值在所有涉及的服务器上都是唯一的。
情况:我有一个表定义:
create table test (
id BIGINT not null primary key auto_increment,
col1 TEXT);该表有一个before 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)值("foo")之后,我需要LAST_INSERT_ID()的值--但我只能得到值"0“。
我在触发器中试了一下:
SET NEW.id = LAST_INSERT_ID(@my_uuid);但是它不起作用。
我读到了mysql手册,上面写着,触发器和函数中对last_insert_id的所有更改都将在触发器结束时取消。
所以我尽量避免更改应用程序(使用php.last_insert_id())...
有什么办法在不改变php代码的情况下解决这个问题吗?
太棒了。
发布于 2009-08-01 09:48:49
我假设您试图避免在两个母版上插入以相同ID结尾的内容。
一种方法(假设有两个主节点)是在一个主节点上将auto_increment_increment设置为2,并将auto_increment_offset设置为0,在另一个主节点上设置为1。
这将导致每个主服务器上的in不会相互冲突。
旁白:使用大整数和随机UUID,由于生日悖论,您当前的方法可能会在大约30亿行的某处发生冲突。
发布于 2013-09-02 18:15:06
与大多数其他数据库服务器技术相比,mysql中的LAST_INSERT_ID在触发器方面的行为实际上是相当“不标准”的。但我发现它更安全,更容易使用。
无论如何,你的问题没有一个确切的答案,因为复制总是很复杂的。但user83591的答案足以为您提供大多数情况下的解决方案。生日悖论的概念也非常到位。你应该接受它作为你的答案。
https://stackoverflow.com/questions/1211411
复制相似问题