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

Можно ли изменить естественный порядок столбцов в Postgres?

Можно ли изменить естественный порядок столбцов в Postgres 8.1?

Я знаю, что вы не должны полагаться на порядок столбцов - это не важно для того, что я делаю, - мне нужно только, чтобы некоторые автоматически генерируемые вещи выходили таким образом, что это было бы более приятным, так что порядок поля соответствует всему пути от pgadmin через задний конец и к переднему концу.

4b9b3361

Ответ 1

На самом деле вы можете просто изменить порядок столбцов, но я бы вряд ли рекомендовал его, и вы должны быть очень осторожны, если решите это сделать.

например.

# CREATE TABLE test (a int, b int, c int);
# INSERT INTO test VALUES (1,2,3);
# SELECT * FROM test;
 a | b | c 
---+---+---
 1 | 2 | 3
(1 row)

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

# SELECT relname, relfilenode FROM pg_class WHERE relname='test';
 relname | relfilenode 
---------+-------------
 test_t  |       27666
(1 row)

# SELECT attrelid, attname, attnum FROM pg_attribute WHERE attrelid=27666;
 attrelid | attname  | attnum 
----------+----------+--------
    27666 | tableoid |     -7
    27666 | cmax     |     -6
    27666 | xmax     |     -5
    27666 | cmin     |     -4
    27666 | xmin     |     -3
    27666 | ctid     |     -1
    27666 | b        |      1
    27666 | a        |      2
    27666 | c        |      3
(9 rows)

attnum - уникальный столбец, поэтому вам нужно использовать временное значение, когда вы изменяете номера столбцов как таковые:

# UPDATE pg_attribute SET attnum=4 WHERE attname='a' AND attrelid=27666;
UPDATE 1
# UPDATE pg_attribute SET attnum=1 WHERE attname='b' AND attrelid=27666;
UPDATE 1
# UPDATE pg_attribute SET attnum=2 WHERE attname='a' AND attrelid=27666;
UPDATE 1

# SELECT * FROM test;
 b | a | c 
---+---+---
 1 | 2 | 3
(1 row)

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

Это работает с postgres 8.3 с предыдущими версиями, ваше перемещение может меняться.

Ответ 2

Если ваша база данных не очень большая, и вы можете позволить себе некоторое время простоя, вы можете:

  • Отключить доступ для записи в базу данных
    это необходимо, так как в противном случае любые изменения после запуска следующего пункта будут потеряны.
  • pg_dump --create --column-inserts databasename > databasename.pgdump.sql
  • Отредактируйте подходящую инструкцию CREATE TABLE в databasename.pgdump.sql
    Если файл слишком большой для вашего редактора, просто разделите его с помощью команды split, отредактируйте, а затем соберите обратно с помощью cat
  • drop database databasename
    У вас последняя резервная копия, на всякий случай, вы?
  • psql --single-transaction -f databasename.pgdump.sql
    Если вы не используете --single-transaction, он будет очень медленным.

Если вы используете так называемые большие объекты, убедитесь, что они включены в дамп. Я не уверен, что они по умолчанию в 8.1.

Ответ 3

Я задал этот вопрос в pgsql-admin в 2007 году. Сам Том Лэйн заявил, что практически невозможно изменить порядок в каталогах. Уточнение:.. для пользователей, с настоящими инструментами (все еще верно для v9.1). Это не значит, что это невозможно осуществить. ИМО, это должно быть.
http://archives.postgresql.org/pgsql-admin/2007-06/msg00037.php

Ответ 4

Как упоминалось в других ответах, вы не можете изменить порядок столбцов, вплоть до postgres. Вы можете (и должны!) Решить вашу проблему с точки зрения. Для целей вашего запроса на отчет он будет выглядеть так же, как таблица. Что-то вроде:

create view my_view as
  select * from my_table
  order by some_col;

Ответ 5

Указание порядка столбцов в запросе является единственным надежным способом (и разумным). Тем не менее, вы обычно можете получить другой порядок, изменив таблицу, как показано в приведенном ниже примере, поскольку столбцы обычно (не гарантируются) возвращаются в том порядке, в котором они были добавлены в таблицу.

postgres=# create table a(a int, b int, c int);
CREATE TABLE
postgres=# insert into a values (1,2,3);
INSERT 0 1
postgres=# select * from a;
 a | b | c
---+---+---
 1 | 2 | 3
(1 row)

postgres=# alter table a add column a2 int;
ALTER TABLE
postgres=# select * from a;
 a | b | c | a2
---+---+---+----
 1 | 2 | 3 |
(1 row)

postgres=# update a set a2 = a;
UPDATE 1
postgres=# alter table a drop column a;
ALTER TABLE
postgres=# alter table a rename column a2 to a;
ALTER TABLE
postgres=# select * from a;
 b | c | a
---+---+---
 2 | 3 | 1
(1 row)

postgres=#

Ответ 6

К сожалению, нет, это не так. Порядок столбцов полностью зависит от Postgres.

Ответ 7

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

CREATE TABLE test_new AS SELECT b, c, a FROM test;
SELECT * from test_new;
 b | c | a 
---+---+---
 2 | 3 | 1
(1 row)

Обратите внимание, что это копирует только данные, а не модификаторы, ограничения, индексы и т.д.

Как только новая таблица будет изменена так, как вы хотите, отбросьте оригинал и измените имя нового:

BEGIN;
DROP TABLE test;
ALTER TABLE test_new RENAME TO test;
COMMIT;