Як я можу вказати позицію для нового стовпця в PostgreSQL?


74

Якщо у мене є таблиця зі стовпцями:

id | name | created_date

і хотів би додати стовпець, я використовую:

alter table my_table add column email varchar(255)

Потім після стовпця додається created_dateстовпчик.

Чи можна вказати позицію для нового стовпця? наприклад, щоб я міг додати його nameі отримати таблицю на зразок:

id | name | email | created_date

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);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.