DROP CONSTRAINT 后主键的索引会发生什么变化?

Mar*_* G. 5 postgresql index database-design primary-key unique-constraint

我正在运行 PostgreSQL 9.1.4。

我有一个包含许多现有行的表,以及一堆其他带有指向它的外键的表,我正在尝试:

1 - 删除当前主键上的 pkey 约束,因为它当前不是串行类型。

2 - 添加一个串行类型的列并将该新列作为主键。

3 - 将步骤 #1 的旧列设置为 UNIQUE 并为所有具有指向我的表的外键的表重新创建外键。事实上,这些表都有两个指向我的表的外键:一个指向当前作为主键的旧列,另一个指向新的串行类型列

我已经成功创建了一个执行此操作的脚本,但我想知道:

a) 在上面的第 1 步删除 pkey 约束是否也会删除与该主键关联的索引?

b)如果没有,有没有办法重用该索引?在第 3 步添加回 UNIQUE 约束后,会创建一个新索引还是使用之前存在的索引?除了创建的新列(串行主键)外,表中没有任何内容被更改。

编辑(一些澄清):

  • 我们将旧的 pk 列称为 OLD_PK,将 to-be-be-be-create-by-my-script 称为新的 pk 列 NEW_PK
  • OLD_PK 列的类型是 INT
  • OLD_PK 列不会也不能被删除(它的信息仍然有价值)因此它也不能将其自身转换为类型序列,现有数据必须保留。
  • 我知道串行是一种快捷方式。就像我说的,我已经想出了一个工作脚本,我和同事不确定的部分是索引以及从这个角度来看它是如何工作的。
  • 之前有一个指向 OLD_PK 的外键的所有表,在执行脚本后,将有一个指向 OLD_PK 的外键(比如“fkey_old_pk”)和另一个指向 NEW_PK 的外键(比如“fkey_new_pk”)

Dan*_*ité 1

是的,删除主键约束将删除索引。

但需要注意的是,serial并不是真正的类型,它是 的快捷方式INT default nextval('some_sequence'),其中some_sequence是自动生成的。

您没有说明当前列类型是什么,但由于您希望能够重用串行列的索引,因此我们假设它是 INT。

如果您计划最终删除旧列,问题并不明显,但如果您只想将其转换为串行列,则无需删除并重新创建关联的约束。只需创建一个序列,将其初始化为主键的下一个值,并让它的 nextval 为该列的默认值,如下所示:

CREATE SEQUENCE myseq START WITH 12345;
Run Code Online (Sandbox Code Playgroud)

其中 12345 被当前替换max(pk)

进而:

ALTER TABLE tablename ALTER COLUMN pk_col SET DEFAULT nextval('myseq');
Run Code Online (Sandbox Code Playgroud)