Подтвердить что ты не робот

Как изменить позицию столбца в таблице базы данных PostgreSQL?

Я пробовал следующее, но я не увенчался успехом:

ALTER TABLE person ALTER COLUMN dob POSITION 37;
4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

    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

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

Ответ 3

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

Ответ 4

В 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;

Ответ 5

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

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

  • Восстановить таблицу
  • Добавить столбцы и переместить данные
  • Скрыть различия с видом.

Ответ 6

Откройте таблицу в 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;, и все готово.

Ответ 7

Я использую 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;

Потому что мне нужен большой псевдотип в таблице. После SELECT * в pg будет создан bigserial типа бигинта.

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