Я спробував наступне, але мені не вдалося:
ALTER TABLE person ALTER COLUMN dob POSITION 37;
Я спробував наступне, але мені не вдалося:
ALTER TABLE person ALTER COLUMN dob POSITION 37;
Відповіді:
" Змінити положення стовпця " в Wiki PostgreSQL:
На даний момент PostgreSQL визначає порядок стовпців на основі
attnum
стовпцяpg_attribute
таблиці. Єдиний спосіб змінити порядок стовпців - або відтворити таблицю, або додавши стовпці та обертаючи дані, поки не досягнете потрібного макета.
Це досить слабко, але на їх захист, у стандартному SQL, немає рішення і для перестановки стовпця. Бренди баз даних, які підтримують зміну порядкового положення стовпця, визначають розширення до синтаксису SQL.
В мене виникає ще одна ідея: ви можете визначити a, 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 ВІД original_tab a ДЕ a.col1 НЕ НУЛЬНИЙ - або все одно
SELECT * INTO new_table FROM original_tab_vw
Перейменуйте або видаліть оригінальну таблицю та встановіть назву нової таблиці на стару таблицю.
Один, хоч і незграбний варіант змінити стовпці, коли порядок стовпців потрібно абсолютно змінити, а зовнішні ключі використовуються, - це спочатку скинути всю базу даних з даними, а потім скинути лише схему ( pg_dump -s databasename > databasename_schema.sql
). Далі відредагуйте файл схеми, щоб переставити стовпці так, як вам хотілося, потім відтворіть базу даних зі схеми та нарешті відновіть дані у новоствореній базі даних.
Зараз я не думаю, що ви можете: див. Цю статтю на вікі Postgresql .
Три вирішення цієї статті:
Відкрийте таблицю в PGAdmin та на панелі SQL внизу скопіюйте оператор SQL Create Table. Потім відкрийте інструмент запитів і вставте. Якщо в таблиці є дані, змініть ім’я таблиці на "new_name", якщо ні, видаліть коментар "-" у рядку "Drop Table". Потрібно відредагувати послідовність стовпців Зверніть увагу на пропущену / зайву кому в останньому стовпчику, якщо ви її перемістили. Виконайте нову команду Створення таблиці SQL. Оновити та ... voilà.
Для порожніх таблиць на етапі проектування цей метод є досить практичним.
У випадку, якщо таблиця містить дані, нам потрібно також переставити послідовність стовпців даних. Це легко: використовуйте INSERT
для імпорту стару таблицю в її нову версію за допомогою:
INSERT INTO new ( c2, c3, c1 ) SELECT * from old;
... де c2
, c3
, c1
є колонами c1
, c2
, c3
зі старої таблиці в своїх нових позиціях. Зауважте, що в цьому випадку ви повинні використовувати "нове" ім'я для відредагованої "старої" таблиці, інакше ви втратите свої дані . У випадку, якщо імен стовпців багато, довгі та / або складні використовують той же метод, що і вище, щоб скопіювати нову структуру таблиці в текстовий редактор і створити там новий список стовпців, перш ніж скопіювати її в INSERT
оператор.
Перевіривши, що все добре, DROP
стару таблицю та змініть ім'я 'new' на 'old' за допомогою, 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, і для цього потрібен стовпчик ідентифікатора в кожній таблиці, якщо ви не хочете боліти головою. На жаль, я був недбалий, і мій стіл 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 типу bigint.
крок 4: Тепер ми можемо опустити подання, скинути вихідну таблицю та перейменувати нову таблицю у стару назву. Трюк закінчився успішно.
Існує декілька способів вирішити ці можливості:
Відтворення цілого столу
Створіть нові стовпці в межах поточної таблиці
Створіть подання