Можно ли изменить естественный порядок столбцов в Postgres?
Можно ли изменить естественный порядок столбцов в Postgres 8.1?
Я знаю, что вы не должны полагаться на порядок столбцов - это не важно для того, что я делаю, - мне нужно только, чтобы некоторые автоматически генерируемые вещи выходили таким образом, что это было бы более приятным, так что порядок поля соответствует всему пути от pgadmin через задний конец и к переднему концу.
Ответы
Ответ 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;