首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mySQL和LAST_INSERT_ID问题

mySQL和LAST_INSERT_ID问题
EN

Stack Overflow用户
提问于 2009-07-31 08:58:26
回答 2查看 1.3K关注 0票数 0

我有一个DB-Application,现在我们必须开始复制(master-master- replication )。我们构建一个存储函数,它返回一个BIGINT。该值在所有涉及的服务器上都是唯一的。

情况:我有一个表定义:

代码语言:javascript
复制
create table test (
 id BIGINT not null primary key auto_increment,
 col1 TEXT);

该表有一个before insert触发器:

代码语言:javascript
复制
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“。

我在触发器中试了一下:

代码语言:javascript
复制
SET NEW.id = LAST_INSERT_ID(@my_uuid);

但是它不起作用。

我读到了mysql手册,上面写着,触发器和函数中对last_insert_id的所有更改都将在触发器结束时取消。

所以我尽量避免更改应用程序(使用php.last_insert_id())...

有什么办法在不改变php代码的情况下解决这个问题吗?

太棒了。

EN

回答 2

Stack Overflow用户

发布于 2009-08-01 09:48:49

我假设您试图避免在两个母版上插入以相同ID结尾的内容。

一种方法(假设有两个主节点)是在一个主节点上将auto_increment_increment设置为2,并将auto_increment_offset设置为0,在另一个主节点上设置为1。

这将导致每个主服务器上的in不会相互冲突。

旁白:使用大整数和随机UUID,由于生日悖论,您当前的方法可能会在大约30亿行的某处发生冲突。

票数 1
EN

Stack Overflow用户

发布于 2013-09-02 18:15:06

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1211411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档