我有两个表已注册的产品和未注册的产品。两者都有自动增量主键,可以重叠,如果 100 个 id 存在 reg 表,它也可以存在于 unreg 表中。插入可以来自应用程序中的许多地方
第三种服务需要两种类型的产品的唯一 ID。
在 oracle 中,我可以在每个表中再引入一列。创建一个序列。现在可以在两个表上创建触发器 before_insert ,这样每当任何表中有插入时,trigerr 都会从序列中获取 next_val 并插入到新列中。这样我可以确保跨表列的唯一编号。
我不确定如何在 mysql 中实现相同的效果,因为有触发器但没有可以跨表使用的序列?
计划 A:有一个第三个表,其中包含
AUTO_INCREMENT
两个现有表之间的任何公共列。计划 B:建立一个“序列”表,它有 2 列:一个
AUTO_INCREMENT
和另一列键入表。可能REPLACE
是在不增加表的情况下获取新 id 的命令。REPLACE
分两步执行:DELETE
在任何UNIQUE
键上匹配的任何行。INSERT
一个新的行。这是表格及其初始化:
要获取新的“下一个”序列号,请使用
REPLACE
:或者,这可能更快,
在每个表上创建一个视图,并在其中一个上将 Id 替换为
Id * 2
,使其始终为偶数。另一方面,将 Id 替换为Id * 2 + 1
,因此它总是很奇怪。两个表中的数字将是唯一的,并且始终可以从原始 ID 到视图的 ID,然后再返回到原始 ID。
或者只是将计算的列添加到调用新列的视图中,例如 UniqueId 并在视图中包含原始 ID。这样就可以保留所有信息,而无需进行任何更多的计算。
西蒙的回答很好。他有效地建议将可能的 id 范围拆分为 2。这也可以通过使用位移右运算符以更灵活的方式完成。然后,您可以通过决定将数字向右移动多少次来决定您希望在同一个 64(?)位数字空间中拥有多少个范围。我不了解 MySQL,但一个简单的检查约束(如在 PostgreSQL 中)可以在每个表的 id 列上强制执行此操作,并且速度非常快。
我们在参考数据库中完成了这项工作,它允许我们在数据库中的所有表中使用单个 64 位 id 字段,并保证表之间不会重复使用。