Генерируемая колонка, не занимающая места - PullRequest
0 голосов
/ 25 апреля 2020

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

-- Create table_registration
ALTER TABLE public.person
DROP COLUMN IF EXISTS entry_name, 
ADD COLUMN entry_name TEXT generated ALWAYS as (concat_ws(' ', hobby)) stored; 

Это иногда вызывает ошибку типа

Npgsql.PostgresException: '42P17: generation expression is not immutable'

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

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

1 Ответ

0 голосов
/ 25 апреля 2020

Начиная с Postgres 12, сгенерированные столбцы всегда stored. Поддержка virtual сгенерированных столбцов, чьи значения вычисляются на лету (и, следовательно, не занимают места на диске), может быть реализована в будущих версиях.

Прямой альтернативой является использование view вместо:

create view person_view as
select p.*, concat_ws(' ', hobby) entry_name
from public.person p
...