Как изменить положение столбца в таблице базы данных PostgreSQL? - PullRequest
88 голосов
/ 13 ноября 2008

Я пробовал следующее, но безуспешно:

ALTER TABLE person ALTER COLUMN dob POSITION 37;

Ответы [ 6 ]

86 голосов
/ 13 ноября 2008

" Изменить положение столбца " в PostgreSQL Wiki говорит:

PostgreSQL в настоящее время определяет столбец порядок на основе столбца attnum таблица pg_attribute. Единственный способ изменить порядок столбцов либо воссоздать таблицу, или добавив столбцы и вращающиеся данные, пока вы достичь желаемого макета.

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

Мне приходит в голову еще одна идея: вы можете определить VIEW, который задает порядок столбцов, как вам нравится, без изменения физической позиции столбца в базовой таблице.

21 голосов
/ 09 января 2014

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

Отсюда я мог бы либо использовать представление, либо создать новую таблицу из представления.

    CREATE VIEW original_tab_vw AS
    SELECT a.col1, a.col3, a.col4, a.col2
    FROM original_tab a
    WHERE a.col1 IS NOT NULL --or whatever
    SELECT * INTO new_table FROM original_tab_vw

Переименуйте или удалите исходную таблицу и установите имя новой таблицы для старой таблицы.

16 голосов
/ 22 декабря 2015

Один, хотя и неуклюжий вариант перестановки столбцов, когда порядок столбцов должен быть абсолютно изменен, а внешние ключи используются, - это сначала сбросить всю базу данных с данными, а затем сбросить только схему (pg_dump -s databasename > databasename_schema.sql). Затем отредактируйте файл схемы, чтобы изменить порядок столбцов, затем заново создайте базу данных из схемы и, наконец, восстановите данные во вновь созданной базе данных.

12 голосов
/ 30 сентября 2016

В PostgreSQL при добавлении поля оно будет добавлено в конец таблицы. Если нам нужно вставить в определенную позицию, то

alter table tablename rename to oldtable;
create table tablename (column defs go here);
insert into tablename (col1, col2, col3) select col1, col2, col3 from oldtable;
7 голосов
/ 13 ноября 2008

Я не думаю, что вы можете сейчас: см. эту статью на Postgresql wiki .

Три обходных пути из этой статьи:

  1. Воссоздать таблицу
  2. Добавление столбцов и перемещение данных
  3. Скрыть различия с видом.
5 голосов
/ 11 января 2015

Откройте таблицу в PGAdmin и в нижней части панели SQL скопируйте инструкцию SQL Create Table. Затем откройте Query Tool и вставьте. Если в таблице есть данные, измените имя таблицы на «новое_имя», если нет, удалите комментарий «-» в строке «Удалить таблицу». Отредактируйте последовательность столбцов, как требуется. Запомните пропущенную / лишнюю запятую в последнем столбце, если вы ее переместили. Выполните новую команду SQL Create Table. Обновить и ... вуаля.

Для пустых таблиц на стадии проектирования этот метод довольно практичен.

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

INSERT INTO new ( c2, c3, c1 ) SELECT * from old;

... где c2, c3, c1 - это столбцы c1, c2, c3 старой таблицы на новых позициях. Обратите внимание, что в этом случае вы должны использовать «новое» имя для отредактированной «старой» таблицы, или вы потеряете данные . Если имена столбцов много, длинные и / или сложные, используйте тот же метод, что и выше, чтобы скопировать новую структуру таблицы в текстовый редактор и создать там новый список столбцов, прежде чем копировать его в оператор INSERT.

Убедившись, что все хорошо, DROP старой таблицы и измените «новое» имя на «старое», используя ALTER TABLE new RENAME TO old;, и все готово.

...