Вопрос:

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

postgresql

27079 просмотра

8 ответа

19601 Репутация автора

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

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

Автор: rjmunro Источник Размещён: 24.09.2008 10:39

Ответы (8)


0 плюса

95805 Репутация автора

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

Автор: Nick Johnson Размещён: 24.09.2008 10:40

1 плюс

213820 Репутация автора

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

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=#
Автор: Vinko Vrsalovic Размещён: 24.09.2008 10:42

4 плюса

0 Репутация автора

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

create view my_view as
  select * from my_table
  order by some_col;
Автор: Please delete this account Размещён: 24.09.2008 12:14

16 плюса

16811 Репутация автора

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

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

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

Автор: Tometzky Размещён: 24.09.2008 02:25

22 плюса

292 Репутация автора

Решение

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

например.

# CREATE TABLE test (a int, b int, c int);
# INSERT INTO VALUALS (1,2,3);
# SELECT * FROM test;
 а | б | с
--- + --- + ---
 1 | 2 | 3
(1 ряд)

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

# ВЫБРАТЬ relname, relfilenode ОТ pg_class WHERE relname = 'test';
 Relname | relfilenode
--------- + -------------
 test_t | 27666
(1 ряд)

# ВЫБРАТЬ attrelid, attname, attnum FROM pg_attribute WHERE attrelid = 27666;
 attrelid | имя attnum
---------- + ---------- + --------
    27666 | скатерть | -7
    27666 | Cmax | -6
    27666 | xmax | -5
    27666 | смин | -4
    27666 | Xmin | -3
    27666 | Ctid | -1
    27666 | б | 1
    27666 | а | 2
    27666 | с | 3
(9 рядов)

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

# ОБНОВЛЕНИЕ pg_attribute SET attnum = 4 ГДЕ attname = 'a' AND attrelid = 27666;
ОБНОВЛЕНИЕ 1
# ОБНОВЛЕНИЕ pg_attribute SET attnum = 1 ГДЕ attname = 'b' AND attrelid = 27666;
ОБНОВЛЕНИЕ 1
# ОБНОВЛЕНИЕ pg_attribute SET attnum = 2 ГДЕ attname = 'a' AND attrelid = 27666;
ОБНОВЛЕНИЕ 1

# SELECT * FROM test;
 б | а | с
--- + --- + ---
 1 | 2 | 3
(1 ряд)

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

Это работает с Postgres 8.3, с предыдущими версиями ваш пробег может отличаться.

Автор: Russell Размещён: 18.03.2009 03:06

8 плюса

388550 Репутация автора

Я задал этот вопрос в pgsql-admin в 2007 году. Сам Том Лейн объявил, что практически невозможно изменить порядок в каталогах.

Пояснение: это относится к пользователям с настоящими инструментами. Это не значит, что это не может быть реализовано. ИМО, так и должно быть.
Все еще верно для Postgres 12.

Автор: Erwin Brandstetter Размещён: 16.09.2011 01:02

0 плюса

202 Репутация автора

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

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;
Автор: Alex Willison Размещён: 30.11.2016 09:28

0 плюса

826 Репутация автора

Я хочу того же. Да, заказывать его сейчас необходимо, но это меня просто теряет :)

Что я делаю, чтобы решить это следующим образом.

Этот метод позволит вам сохранить любые существующие данные,

  1. Создайте новую версию таблицы, используя порядок, который я хочу, используя временное имя.
  2. Вставьте все данные в эту новую таблицу из существующей.
  3. Оставь старый стол.
  4. Переименуйте новую таблицу в «Собственное имя» из «Временное имя».
  5. Повторно добавьте все индексы, которые у вас были ранее.
  6. Сбросить последовательность ID для приращений первичного ключа.

Текущий порядок столов:

id, name, email

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

В этом примере я хочу emailбыть раньше name.

CREATE TABLE mytable_tmp
(
  id SERIAL PRIMARY KEY,
  email text,
  name text
);

2. Вставьте все данные в эту новую таблицу из существующей.

INSERT INTO mytable_tmp   --- << new tmp table
(
  id
, email
, name
)
SELECT
  id
, email
, name
FROM mytable;  --- << this is the existing table

3. Оставьте старый стол.

DROP TABLE mytable;

4. Переименуйте новую таблицу в «Собственное имя» из «Временное имя».

ALTER TABLE mytable_tmp RENAME TO mytable;

5. Повторно добавьте все индексы, которые у вас были ранее.

CREATE INDEX ...

6. Сбросьте последовательность ID для приращений первичного ключа.

SELECT setval('public.mytable_id_seq', max(id)) FROM mytable;
Автор: Turgs Размещён: 01.02.2018 11:48
Вопросы из категории :
32x32