如何修改PostgreSQL数据库表中列的位置?
如何在PostgreSQL数据库表中更改列的位置?
有一种笨拙的方法可以在必须完全更改列顺序且使用了外键时重新排列列,即首先使用数据完整地转储整个数据库,然后只转储模式(pg_dump -s databasename > databasename_schema.sql)。接下来编辑模式文件以按您想要的方式重新排列列,然后根据模式重新创建数据库,最后将数据恢复到新创建的数据库中。
为什么会有人对此进行反对票?正如接受的答案指出的那样,引用PostgreSQL Wiki:“更改列顺序的唯一方法是重新创建表格或通过添加列并旋转数据,直到达到所需布局。”这个解决方案并不是最佳的(在没有内置操作来完成任务的情况下,这些答案都不是最佳的),但它确实提供了一种重新排列表中列的方法。
我再说一次,没有好的方法来做到这一点,我上面所描述的方法是一种有效的重新排列列的方式,如果必须重新排列列的话。如果你对我的答案进行反对票,请解释为什么你认为这是一个不可接受的解决方案。
事实上,当表是其他表的外键时,这是一个非常好的解决方案。所有其他解决方案在这种情况下都不起作用。最后,使用pg_dump --column-inserts -s databasename > databasename_schema.sql。
原因:在PostgreSQL中,没有内置的操作来直接更改列的位置。因此,当需要更改列的顺序且表中存在外键时,需要使用一些笨拙的方法来重新排列列。
解决方法:其中一种解决方法是先转储整个数据库,包括数据和模式,然后编辑模式文件以重新排列列的顺序,最后根据修改后的模式重新创建数据库,并将数据恢复到新创建的数据库中。这种方法可以保持外键关系。另外一种解决方法是使用pg_dump命令将模式转储到文件,然后手动编辑文件以重新排列列的顺序,最后使用pg_restore命令将修改后的模式恢复到数据库中。这种方法不会保留外键关系。无论哪种方法,都需要进行一些复杂的操作来达到重新排列列的目的。
问题的原因:
PostgreSQL目前根据pg_attribute表的attnum列来定义列的顺序。要改变列的顺序,唯一的方法要么是重新创建表,要么是添加列并旋转数据直到达到期望的布局。标准SQL中也没有提供重新定位列的解决方案。
解决方法:
在基本表中不改变列的物理位置的情况下,可以定义一个视图来指定列的顺序。此外,还可以通过重新创建表或添加新列来复制和删除旧列的数据,从而实现改变列的顺序。
在MySQL中,可以通过复制表并重新排列列的顺序,然后删除旧表来改变列的位置。但是这个解决方法只适用于MySQL,不适用于PostgreSQL。
参考链接:
- [Alter column position](http://wiki.postgresql.org/wiki/Alter_column_position)
- [How to change the column position of MySQL table without losing column data](https://stackoverflow.com/questions/10718905)
如何在PostgreSQL数据库表中改变列的位置?
在PostgreSQL中,当我们添加一个字段时,它会被添加到表的末尾。如果我们需要插入到特定的位置,可以采用以下方法:
alter table tablename rename to oldtable; create table tablename (column defs go here); -- 带有所有约束条件 insert into tablename (col1, col2, col3) select col1, col2, col3 from oldtable;
这个方法非常好,我相信这应该是被接受的答案!
你还可以像这样将当前表复制到一个新的oldtable:`CREATE TABLE oldtable AS SELECT * FROM tablename;`
完美地工作!这真的应该是被接受的答案!
以下是一个使用真实值的示例:`insert into newTable (id, created, start, end, message) SELECT id, created, start, end, message FROM oldTable;`
从一个表移动到另一个表并不容易,因为它们之间还有其他相关的对象,比如约束条件。
我认为这个解决方案也会打乱外键。`ALTER TABLE ... RENAME TO ...`似乎会相应地更改其他表中现有的外键关系。这意味着最后外键指向的是`oldtable`,但数据实际上在新表中。我认为在正确删除`oldtable`之前,需要手动迁移所有外键关系。