2014-10-28 6 views
0

У меня есть таблица с одним столбцом с неупорядоченным значением. Я хочу заказать этот столбец по убыванию и добавить столбец для записи его порядка. Мой SQL-код:Добавить последовательный столбец на основе отсортированного столбца

select * 
into newtable 
from oldtable 
order by column_name desc; 

alter table newtable add column id serial; 

Будет ли это реализовывать мою цель? Я знаю, что строки в PostgreSQL не имеют фиксированного порядка. Поэтому я не уверен в этом.

+3

Пожалуйста, не используйте 'select .. in' для создания новой таблицы. Это старый и устаревший синтаксис. Вместо этого используйте стандартный SQL: 'create table ... as select ...'. –

+0

Просто выполните простой тест, и у вас будет ответ. До сих пор я не вижу проблем с вашим кодом. – vyegorov

+3

Какая проблема вы _really_ пытаетесь решить? Новый столбец также может быть «неупорядоченным» (вы можете сделать это без создания новой таблицы btw). –

ответ

2

Вместо (ab) с использованием SERIAL через ALTER TABLE, сгенерируйте его во время вставки.

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, и до стола не было ПК, изменить unique not null к primary key. Если до стола была PK вам нужно использовать LIKE вариант, который исключает constraints).

+0

Ничего себе. Отлично. Я никогда раньше не видел функцию nextval. Мне так нужно учиться. – Ben

+0

@Ben Вам не нужно явно использовать 'nextval'; вы можете вместо этого опустить «id» из вставленных столбцов, назвав все остальные. Это было проще написать, когда я не знал имена столбцов. –

+0

Теперь я полностью понимаю. Спасибо за вашу помощь. – Ben

Смежные вопросы