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 约束后,会创建一个新索引还是使用之前存在的索引?除了创建的新列(串行主键)外,表中没有任何内容被更改。
编辑(一些澄清):
是的,删除主键约束将删除索引。
但需要注意的是,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)
| 归档时间: |
|
| 查看次数: |
2094 次 |
| 最近记录: |