如何在一个客户端上有多个用户的 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的主要内容,如果未能解决你的问题,请参考以下文章