【问题标题】:union table, change serial primary key, postgresql联合表,更改串行主键,postgresql
【发布时间】:2017-07-26 07:49:53
【问题描述】:

Postgresql:

我在 postgresql 中有两个表 'abc' 和 'xyz'。两个表都有相同的 'id' 列,类型是 'serial primary key;'。 abc 表 id 列值为 1,2,3,xyz id 列包含相同的值 1,2,3,4 我想用“联合所有”约束来联合两个表。但我想将 'xyz' id 列值更改为 'abc' id 列的下一个值作为 1,2,3,4,5,6,7

select id from abc
union all
select id from xyz

|id|
 1
 2
 3
 1
 2
 3
 4

my wanted resuls as
|id|
 1
 2
 3
 4
 5
 6
 7

【问题讨论】:

  • 这是一个不合理的要求。自动生成的 ID 没有任何意义。您想解决的真正问题是什么?
  • @LaurenzAlbe 是一个 stackoverflow 用户,他停下来询问“您要解决的问题是什么,而不是您想解决的问题的解决方案的问题”。稀有的!我喜欢!

标签: sql postgresql union


【解决方案1】:

更好 - 感谢@CaiusJard 这应该会为你做的

select id FROM abc 
UNION ALL select x.id + a.maxid FROM xyz x, 
(SELECT MAX(id) as maxid from abc) a
ORDER BY id

【讨论】:

  • 哎呀,这有点恶心;交叉连接所有行上的表,这样您就可以找到最大 a.id。为什么不使用计算出最大 a.id 的子查询,那么如果两个表都有一百万行,那么您就不会生成一万亿行为了一个号码?另外..他要求联合所有,你使用联合 - 这也会导致轻微的性能下降,因为需要额外的工作来删除重复项(可能不存在)
【解决方案2】:

对于任何正在做这样的事情的人:

我遇到了类似的问题,我有表 A 和表 B,它们有两个不同的序列号。我的解决方案是创建一个与表 B 相同的新表 C,除了它有一个“oldid”列,并且 id 列设置为使用与表 A 相同的序列。然后我将表 B 中的所有数据插入到表中C(将 id 放在 oldid 字段中)。一旦我修复了从 oldid 指向(新)id 的引用,我就能够删除 oldid 列。

在我的情况下,我需要修复旧的关系,并且需要它在未来保持唯一(但我不在乎表 A 中的 id 必须都在表 C 中的之前)。根据您要完成的任务,这种方法可能很有用。

如果有人要使用这种方法,严格来说,应该有一个触发器来防止有人手动设置一个表中的 id 以匹配另一个表。您还应该将序列更改为由 NONE 拥有,这样如果表 A 曾经被删除,它就不会随表 A 一起删除。

【讨论】:

    猜你喜欢
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 2014-06-28
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多