如何在一个客户端上有多个用户的 MySql 中保证和返回唯一 ID

Posted

技术标签:

【中文标题】如何在一个客户端上有多个用户的 MySql 中保证和返回唯一 ID【英文标题】:How to guarantee and return unique ID in MySql with many users on one client 【发布时间】:2018-10-29 23:54:45 【问题描述】:

所以我正在开发一个包含三个表的 mysql 数据库:

表 1 定义了一种水果,包括“名称”、“颜色”、“风味”和“水果 ID”等列。

表 2 定义了一个类别,包括“名称”、“描述”和“Cat_ID”等列。

表 3 定义了水果和类别之间的关系,有两列,“Fruit_ID”和“Cat_ID”。

每次插入水果时,都必须使用表 3 将其与类别相关联。我最初的计划是让 Fruit_ID 和 Cat_ID 自动递增并使用 this method,但问题是我的架构有多个用户共享一个客户端连接,并且 LAST_INSERT_ID 只是 guaranteed 对每个客户都是正确的,afaik。

所以我的问题是,我可以使用什么样的 SQL Query 来确保在表 1 中输入水果时,使用表 2 中正确的 Fruit_ID 对其进行分类?

另外,如果这不是建立这种关联的最佳方式(我是数据库架构的新手),我愿意重组我的数据库。

我不愿意在 SQL 中使用存储过程。

提前非常感谢!

【问题讨论】:

郑重声明,我的数据库实际上并不是关于水果的,但水果是用于此类事情的一个简单示例...... 你说有多个用户只共享一个客户端连接是什么意思? 查询将来自 Inductive Automation Ignition 客户端,这些客户端实际上将查询文本发送到具有共享连接池的网关;不知道给定查询将使用哪个连接。所以从技术上讲,我的问题措辞不准确,但我怀疑仍然必须有解决此类问题的方法。 这个系统是否允许将多个语句作为一个文本发送?如果是,则没有问题。只需将插入和选择 LAST_INSERT_ID() 作为一个复合语句发送。 所以你的语句没有在事务中运行? 【参考方案1】:

如果您不能使用LAST_INSERT_ID(),则必须使用查询来获取您刚刚插入的项目的 ID。

所以要添加一行显示苹果是红色的,您可以这样做:

INSERT INTO fruit_category (fruit_id, cat_id)
SELECT f.id, c.id
FROM fruit AS f
CROSS JOIN category AS c
WHERE f.name = 'apple'
AND c.name = 'red'

如果您正在创建这种关系并且不只是添加行,这与您将执行的操作相同。

【讨论】:

以上是关于如何在一个客户端上有多个用户的 MySql 中保证和返回唯一 ID的主要内容,如果未能解决你的问题,请参考以下文章

Redis与MySQL双写一致性如何保证?

美团二面:Redis与MySQL双写一致性如何保证?

在mysql上分区或不分区

当您在一个站点上有多个页面并且单击链接只是向下滚动时,如何调用页面?

mysql 事务

如何保证多线程从mysql数据库查询的数据不重复