Я пробовал следующее, но мне это не удалось:
ALTER TABLE person ALTER COLUMN dob POSITION 37;
Я пробовал следующее, но мне это не удалось:
ALTER TABLE person ALTER COLUMN dob POSITION 37;
Ответы:
« Изменить позицию столбца » в PostgreSQL Wiki говорит:
PostgreSQL в настоящее время определяет порядок столбцов на основе
attnum
столбцаpg_attribute
таблицы. Единственный способ изменить порядок столбцов - либо воссоздать таблицу, либо добавить столбцы и повернуть данные, пока не достигнете желаемого макета.
Это довольно слабо, но в их защиту в стандартном SQL тоже нет решения для изменения положения столбца. Бренды баз данных, которые поддерживают изменение порядкового номера столбца, определяют расширение синтаксиса SQL.
Мне пришла в голову еще одна идея: вы можете определить, VIEW
который определяет порядок столбцов, как вам нравится, без изменения физического положения столбца в базовой таблице.
В 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;
Этот пост старый и, вероятно, решен, но у меня была та же проблема. Я решил эту проблему, создав представление исходной таблицы, указав новый порядок столбцов.
Отсюда я мог либо использовать представление, либо создать новую таблицу из представления.
СОЗДАТЬ ПРОСМОТР original_tab_vw AS ВЫБЕРИТЕ a.col1, a.col3, a.col4, a.col2 FROM original_tab a ГДЕ a.col1 НЕ НУЛЕВО - или что угодно
ВЫБРАТЬ * В новую_таблицу ИЗ исходной_таблицы
Переименуйте или удалите исходную таблицу и задайте имя новой таблицы старой таблице.
Один, хотя и неуклюжий вариант переупорядочения столбцов, когда порядок столбцов должен быть абсолютно изменен и используются внешние ключи, - сначала выгрузить всю базу данных с данными, а затем выгрузить только схему ( pg_dump -s databasename > databasename_schema.sql
). Затем отредактируйте файл схемы, чтобы изменить порядок столбцов по своему усмотрению, затем воссоздайте базу данных из схемы и, наконец, восстановите данные во вновь созданной базе данных.
Я не думаю, что в настоящее время это возможно: см. Эту статью в вики Postgresql .
Три обходных пути из этой статьи:
Откройте таблицу в PGAdmin и на панели SQL внизу скопируйте оператор SQL Create Table. Затем откройте инструмент запросов и вставьте. Если в таблице есть данные, измените имя таблицы на 'new_name', если нет, удалите комментарий «-» в строке Drop Table. При необходимости отредактируйте последовательность столбцов. Обратите внимание на отсутствующую / лишнюю запятую в последнем столбце, если вы ее переместили. Выполните новую команду 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;
и все готово.
Я работал над переупорядочиванием большого количества таблиц и не хотел писать одни и те же запросы снова и снова, поэтому я сделал сценарий, который сделает все это за меня. По сути, это:
pg_dump
pg_dump
запрос для создания переупорядоченной таблицы с даннымиЕго можно использовать, выполнив следующую простую команду:
./reorder.py -n schema -d database table \
first_col second_col ... penultimate_col ultimate_col --migrate
Он распечатывает sql, чтобы вы могли проверить и протестировать его, и это была большая причина, по которой я его основал pg_dump
. Вы можете найти репозиторий на github здесь .
Я использую Django, и для него требуется столбец id в каждой таблице, если вы не хотите иметь головную боль. К сожалению, я был неосторожен, и моя таблица bp.geo_location_vague не содержала этого поля. Я подписал маленькую хитрость. Шаг 1:
CREATE VIEW bp.geo_location_vague_vw AS
SELECT
a.id, -- I change order of id column here.
a.in_date,
etc
FROM bp.geo_location_vague a
Шаг 2: (без создания таблицы - таблица будет создана автоматически!)
SELECT * into bp.geo_location_vague_cp2 FROM bp.geo_location_vague_vw
Шаг 3:
CREATE SEQUENCE bp.tbl_tbl_id_seq;
ALTER TABLE bp.geo_location_vague_cp2 ALTER COLUMN id SET DEFAULT nextval('tbl_tbl_id_seq');
ALTER SEQUENCE bp.tbl_tbl_id_seq OWNED BY bp.geo_location_vague_cp2.id;
SELECT setval('tbl_tbl_id_seq', COALESCE(max(id), 0)) FROM bp.geo_location_vague_cp2;
Потому что мне нужен псевдотип bigserial в таблице. После SELECT * в pg будет создан тип bigint insetad bigserial.
Шаг 4: Теперь мы можем отбросить представление, отбросить исходную таблицу и переименовать новую таблицу со старым именем. Уловка завершилась успешно.
Есть несколько обходных путей, чтобы сделать это возможным:
Воссоздание всей таблицы
Создать новые столбцы в текущей таблице
Создать представление