是否可以创建两个主键ID标识符完全不重叠的数据库表?
两张表ID互斥的实现方案
需求核心是保证两张表的id列取值完全不重叠,不存在相同ID,该需求可以通过以下几种常用方案稳定实现:
- 方案1:全局共享序列
所有支持序列对象的数据库(PostgreSQL、Oracle等)都可以创建独立的全局序列,两张表的id列默认值统一从该序列取值。以PostgreSQL为例:
所有自动生成的ID都会全局唯一,天然不会在两张表中出现重复。-- 创建全局共享序列 CREATE SEQUENCE global_disjoint_id_seq; -- 表A id列默认值绑定序列 ALTER TABLE 表A ALTER COLUMN id SET DEFAULT nextval('global_disjoint_id_seq'); -- 表B id列默认值绑定序列 ALTER TABLE 表B ALTER COLUMN id SET DEFAULT nextval('global_disjoint_id_seq'); - 方案2:ID区间分段隔离
给两张表预先分配完全不重叠的ID取值区间,设置自增规则的上下限即可,该方案性能损耗极低,适合业务规模可预估的场景。以MySQL为例:-- 表A ID区间设置为1~1000000000 ALTER TABLE 表A AUTO_INCREMENT = 1; -- 额外增加CHECK约束限制ID最大值(MySQL 8.0.16及以上支持) ALTER TABLE 表A ADD CHECK (id < 1000000000); -- 表B ID区间设置为1000000001~2000000000 ALTER TABLE 表B AUTO_INCREMENT = 1000000001; ALTER TABLE 表B ADD CHECK (id >= 1000000000 AND id < 2000000000); - 方案3:触发器兜底校验
不管使用上述哪种方案,都可以增加数据库触发器做最终校验,避免人工手动插入指定ID导致的冲突问题。写入前触发器会校验待写入ID是否在另一张表存在,存在则直接抛出异常终止操作。
你给出的示例中,表A现有ID范围为03,表B现有ID范围为4050,本身已经符合互斥要求,使用上述任意方案都可以长期保持ID互斥的特性。
内容的提问来源于stack exchange,提问作者Vivek
相关产品推荐
相关产品推荐

