Как я могу указать позицию для нового столбца в PostgreSQL?

75

Если у меня есть таблица со столбцами:

id | name | created_date

и хотел бы добавить столбец, я использую:

alter table my_table add column email varchar(255)

Затем столбец добавляется после created_dateстолбца.

Есть ли способ указать позицию для нового столбца? например, чтобы я мог добавить его после nameи получить таблицу вроде:

id | name | email | created_date
Jonas
источник
4
Там нет необходимости делать это. Просто поместите их в выбранный оператор в том порядке, в котором вы хотите.
a_horse_with_no_name
@jonas, чтобы вы могли также создать это viewшоу в таком порядке ... технически положение столбца не должно иметь значения, так как вы можете определить их в любом порядке в запросе ... и вы вообще не должны делатьselect *
ксенотеррацид
2
@a_horse: Ну, намного сложнее работать (как разработчик / администратор) с таблицами, когда столбцы имеют много разных порядков. Когда у меня 15 столбцов в таблице, я действительно предпочитаю, чтобы они были в одинаковом порядке во всех базах данных.
Джонас
2
@jonas вы можете определять имена столбцов при выполнении вставок и обновлений и, таким образом, делать порядок неактуальным.
ксенотеррацид
2
@Jonas: Затем напишите свою собственную альтернативу \ d, которая сообщает столбцы в нужном вам порядке (это только запрос к системным таблицам: попробуйте использовать psql -Eпереключатель, чтобы увидеть фактический запрос)
Джек Дуглас

Ответы:

54

ALTER TABLE ADD COLUMNдобавит только новый столбец в конце, как последний. Чтобы создать новый столбец в другой позиции, вам необходимо заново создать таблицу и скопировать данные из старой / текущей таблицы в эту новую таблицу.

Мэриан
источник
4
Это верно ... но кто-нибудь действительно использует этот метод? :-)
Мариан
2
Если это проще, чем воссоздание таблицы и всех дочерних таблиц , внешних ключей и грантов :) Я подумал, что ссылка может быть полезна в любом случае, так как она предлагает объяснение, почему вы не можете указать позицию, и надеюсь, что она может быть реализована в будущая версия.
Джек Дуглас
22

Вам нужно будет воссоздать таблицу, если вы хотите определенный порядок. Просто сделайте что-то вроде:

alter table tablename rename to oldtable;
create table tablename (column defs go here);
insert into tablename (col1, col2, col3) select col2, col1, col3 from oldtable;

Создавайте индексы по мере необходимости и т. Д.

Скотт Марлоу
источник
2

Если вы хотите это просто для внешнего вида, мне будет проще сохранить представление для каждой таблицы с желаемым порядком столбцов и выбирать из нее вместо таблицы.

create table my_table (
create view view_my_table as
  select id, name, created_date from my_table;

-- adding a new column
begin;
alter table my_table add column email varchar(255);
drop view view_my_table;
create view view_my_table as
  select id, name, email, created_date from my_table;
commit;

Для всех других целей (например, вставка, объединение) лучше всегда указывать список столбцов.

-- bad
insert into my_table values (...);
(select * from my_table)
  union all
(select * from my_table);

-- good
insert into my_table (id, name, email, created_date) values (...);
(select id, name, email, created_date from my_table)
  union all
(select id, name, email, created_date from my_table);
Симон Перепелица
источник