2009-08-07 57 views

回答

49

没有,有没有直接的方法来做到这一点。这是有原因的 - 每个查询都应该列出所需的所有字段,而不管它们需要什么顺序(和格式等),从而使得一个表中列的顺序无关紧要。

如果你真正需要做的,我能想到一个变通方法:

  • 转储和保存表的问题的说明(使用pg_dump --schema-only --table=<schema.table> ...
  • 要将其添加你想要的列在已保存的定义
  • 在已保存的定义重命名表,以便与旧表的名称相冲突,当您试图创建
  • 创建新表使用这个定义
  • 使用'INSERT INTO <new_table> SELECT field1,field2,<default_for_new_field>,field3,... FROM <old_table>'来填充新表格中的数据。
  • 重命名旧表
  • 新表重命名为原来的名称
  • 最终删除旧,重命名表,你要确保一切是正常
+12

“每个查询都应该以任何顺序列出它所需的所有字段”→这很容易,只要你不需要与其他人一起工作即可。 – 2015-05-24 04:36:01

+9

列的顺序可能与使用数据库的应用程序无关。如果在调查表结构或数据时按顺序列出相似的列,那么DBA看起来会更好。我个人觉得很烦人,我有几个时间列,因为他们稍后添加而没有进行可视化分组。仅仅因为Postgres不支持在特定位置添加列而重新创建数据库对我来说感觉很奇怪,特别是如果其背后的原因是强制人们在他们的查询中明确列出列。要清楚:我不相信这是原因。 – Dynom 2016-03-11 09:36:17

-3

后列的顺序是完全不相关在关系数据库中

是的。

例如,如果你使用Python,你会怎么做:

cursor.execute("SELECT id, name FROM users") 
for id, name in cursor: 
    print id, name 

或者,你会怎么做:

cursor.execute("SELECT * FROM users") 
for row in cursor: 
    print row['id'], row['name'] 

但是,没有理智的人会永远使用这样的定位结果:

cursor.execute("SELECT * FROM users") 
for id, name in cursor: 
    print id, name 
+9

这完全是不真实的。这适用于选择您展示的方式,但在指定列名称的情况下看到插入内容并不罕见,例如插入表值(1,2,3,4)。如果表列顺序发生更改,那么插入查询的样式将失败。还值得注意的是,不是每个开发者都是理智的,如果你碰巧继承了其中一个开发者的代码...... – 2013-08-27 22:39:51

21

列的顺序并非无关紧要,将固定宽度的列放在表的前面可以选择缩小数据的存储布局,还可以在应用程序代码之外更轻松地处理数据。

PostgreSQL不支持更改列排序(请参阅PostgreSQL wiki上的Alter column position);如果表是相对孤立的,最好的办法是重新创建表:

CREATE TABLE foobar_new (...); 
INSERT INTO foobar_new SELECT ... FROM foobar; 
DROP TABLE foobar CASCADE; 
ALTER TABLE foobar_new RENAME TO foobar; 

如果你有很多的观点或对表定义的约束,可以在新列后重新添加所有列和删除原始列(请参阅PostgreSQL wiki中的示例)。

-1

@Jeremy Gustie的解决方案上面的差不多的工作,但会做错误的事情,如果有序关闭(或如果重新排序的序使不兼容的类型匹配完全失败)。试试看:

CREATE TABLE test1 (one varchar, two varchar, three varchar); 
CREATE TABLE test2 (three varchar, two varchar, one varchar); 
INSERT INTO test1 (one, two, three) VALUES ('one', 'two', 'three'); 
INSERT INTO test2 SELECT * FROM test1; 
SELECT * FROM test2; 

结果显示问题:

testdb=> select * from test2; 
three | two | one 
-------+-----+------- 
one | two | three 
(1 row) 

您可以在插入指定的列名解决这个问题:

INSERT INTO test2 (one, two, three) SELECT * FROM test1; 

这就给了你什么你真想:

testdb=> select * from test2; 
three | two | one 
-------+-----+----- 
three | two | one 
(1 row) 

问题出现在你有遗产不这样做时,正如我在我对peufeu的回复评论中所指出的那样。

更新:在我看来,通过在SELECT子句中指定列名,您可以对INSERT子句中的列名执行相同的操作。你只需要重新排序到目标表匹配序:

INSERT INTO test2 SELECT three, two, one FROM test1; 

而且你当然可以做两个非常明确的:

INSERT INTO test2 (one, two, three) SELECT one, two, three FROM test1; 

,将给你相同的结果上面,列值适当匹配。

-2

@米伦A.拉德夫

从具有列一组顺序无关的需求不是由拉他们查询始终定义。在pg_fetch_row的值中不包含关联的列名称,因此需要由SQL语句定义列。

一个简单select * from需要的表结构的先天知识,有时会造成问题,如果列的顺序要改变。

使用pg_fetch_assoc是一种更可靠的方法,因为您可以引用列名称,因此可以使用简单的select * from

+1

这种需求并非无关紧要。当我手动检查数据时,我想简单地使用'SELECT *',但我希望更有趣的列先来。 – maaartinus 2014-02-19 06:38:43

相关问题