如何使用postgres在表中的第二列或第三列之后的表中添加新列?如何使用postgres在表中的第二列或第三列之后添加表中的新列?
我的代码如下
ALTER TABLE n_domains ADD COLUMN contract_nr int after owner_id
如何使用postgres在表中的第二列或第三列之后的表中添加新列?如何使用postgres在表中的第二列或第三列之后添加表中的新列?
我的代码如下
ALTER TABLE n_domains ADD COLUMN contract_nr int after owner_id
没有,有没有直接的方法来做到这一点。这是有原因的 - 每个查询都应该列出所需的所有字段,而不管它们需要什么顺序(和格式等),从而使得一个表中列的顺序无关紧要。
如果你真正需要做的,我能想到一个变通方法:
pg_dump --schema-only --table=<schema.table> ...
)<new_table>
SELECT field1,field2,<default_for_new_field>
,field3,... FROM <old_table>
'来填充新表格中的数据。“每个查询都应该以任何顺序列出它所需的所有字段”→这很容易,只要你不需要与其他人一起工作即可。 – 2015-05-24 04:36:01
列的顺序可能与使用数据库的应用程序无关。如果在调查表结构或数据时按顺序列出相似的列,那么DBA看起来会更好。我个人觉得很烦人,我有几个时间列,因为他们稍后添加而没有进行可视化分组。仅仅因为Postgres不支持在特定位置添加列而重新创建数据库对我来说感觉很奇怪,特别是如果其背后的原因是强制人们在他们的查询中明确列出列。要清楚:我不相信这是原因。 – Dynom 2016-03-11 09:36:17
后列的顺序是完全不相关在关系数据库中
是的。
例如,如果你使用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
这完全是不真实的。这适用于选择您展示的方式,但在指定列名称的情况下看到插入内容并不罕见,例如插入表值(1,2,3,4)。如果表列顺序发生更改,那么插入查询的样式将失败。还值得注意的是,不是每个开发者都是理智的,如果你碰巧继承了其中一个开发者的代码...... – 2013-08-27 22:39:51
列的顺序并非无关紧要,将固定宽度的列放在表的前面可以选择缩小数据的存储布局,还可以在应用程序代码之外更轻松地处理数据。
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中的示例)。
@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;
,将给你相同的结果上面,列值适当匹配。
@米伦A.拉德夫
从具有列一组顺序无关的需求不是由拉他们查询始终定义。在pg_fetch_row
的值中不包含关联的列名称,因此需要由SQL语句定义列。
一个简单select * from
需要的表结构的先天知识,有时会造成问题,如果列的顺序要改变。
使用pg_fetch_assoc
是一种更可靠的方法,因为您可以引用列名称,因此可以使用简单的select * from
。
这种需求并非无关紧要。当我手动检查数据时,我想简单地使用'SELECT *',但我希望更有趣的列先来。 – maaartinus 2014-02-19 06:38:43
列的顺序在关系数据库中完全不相关 - 这只是将它们显示在工具中的问题。数据库表没有任何列的排序。 – 2009-08-07 09:22:09