2014-10-28 64 views
0

我有一个表有一个无序值的列。我想降序排列此列,并添加一列以记录其顺序。我的SQL代码是:添加一个基于排序列的序列列

select * 
into newtable 
from oldtable 
order by column_name desc; 

alter table newtable add column id serial; 

这会实现我的目标吗?我知道PostgreSQL中的行没有固定的顺序。所以我不确定这一点。

+3

请不要使用'select .. into'来创建一个新表。这是一种陈旧和不赞成的语法。改用标准的SQL:'create table ... as select ...'。 – 2014-10-28 11:41:07

+0

只要做一个简单的测试,你就会得到答案。到目前为止,我没有看到你的代码的问题。 – vyegorov 2014-10-28 11:41:56

+3

你正在努力解决什么问题?新列也可以变得“无序”(你可以在不创建新表的情况下做到这一点)。 – 2014-10-28 11:41:57

回答

2

而不是(ab)通过ALTER TABLE使用SERIAL,在插入时生成它。

CREATE TABLE newtable (id serial unique not null, LIKE oldtable INCLUDING ALL); 

INSERT INTO newtable 
SELECT nextval('newtable_id_seq'), * 
FROM oldtable 
ORDER BY column_name desc; 

这样可以避免表格重写,而且不像以前的方法,可以保证产生正确的顺序。

(如果你希望它是PK,和之前的表没有PK,改变unique not nullprimary key。如果事先表有一个PK,你需要使用一个LIKE变种排除constraints)。

+0

哇。大。我从未见过nextval函数。我非常需要学习。 – Ben 2014-10-29 03:11:46

+0

@Ben你不必明确地使用'nextval';您可以通过命名所有其他列来省略插入列中的'id'。当我不知道列名时,这更容易编写。 – 2014-10-29 03:16:26

+0

现在我完全明白了。谢谢你的帮助。 – Ben 2014-10-29 03:33:39