Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 Автогенерируемые столбцы наследуются как обычные негенерируемые  [new]
Cyrax_02
Member

Откуда:
Сообщений: 1396
PostgreSQL 13
https://postgrespro.ru/docs/postgresql/13/ddl-inherit
Отношение наследования между таблицами обычно устанавливается при создании дочерней таблицы с использованием предложения INHERITS оператора CREATE TABLE. Другой способ добавить такое отношение для таблицы, определённой подходящим образом — использовать INHERIT с оператором ALTER TABLE. Для этого будущая дочерняя таблица должна уже включать те же столбцы (с совпадающими именами и типами), что и родительская таблица. Также она должна включать аналогичные ограничения-проверки (с теми же именами и выражениями). Удалить отношение наследования можно с помощью указания NO INHERIT оператора ALTER TABLE. Динамическое добавление и удаление отношений наследования может быть полезно при реализации секционирования таблиц.
Имеется базовая таблица с автогенерируемым столбцом. В дочерней таблице наследуемые столбцы можно создать двумя способами:
1) при создании дочерней таблицы с указанием INHERITE base_table.
2) в уже созданной дочерней таблице путём добавления всех наследуемых полей с теми же именами, типами и ограничениями (NULL + CHECK) и выполнения ALTER TABLE child_table INHERITE base_table.

Проблема в том, что во втором случае автогенерируемый столбец наследуется как обычный (негенерируемый) столбец.
Тогда как в первом случае он наследуется корректно - как автогенерируемый.

Вопросы:
1) Как во втором случае корректно унаследовать автогенерируемый столбец ?
2) Как в уже созданной таблице изменить выражение генерации значения автогенерируемого столбца без его пересоздания ?
10 ноя 20, 16:00    [22229646]     Ответить | Цитировать Сообщить модератору
 Re: Автогенерируемые столбцы наследуются как обычные негенерируемые  [new]
Cyrax_02
Member

Откуда:
Сообщений: 1396
Судя по всему, проблема №1 является следствием проблемы №2...
10 ноя 20, 16:38    [22229667]     Ответить | Цитировать Сообщить модератору
 Re: Автогенерируемые столбцы наследуются как обычные негенерируемые  [new]
big-trot
Member

Откуда: Тверь
Сообщений: 287
Cyrax_02,

Если я правильно понял вопрос, то что мешает создать в наследуемой таблице для поля отвечающего за автогенерацию умолчательное заполнение по сиквенсу созданному для базовой таблицы.
11 ноя 20, 17:23    [22230291]     Ответить | Цитировать Сообщить модератору
 Re: Автогенерируемые столбцы наследуются как обычные негенерируемые  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4396
Cyrax_02
Судя по всему, проблема №1 является следствием проблемы №2...


автогенерируемые это default nextval или честные https://www.postgresql.org/docs/13/ddl-generated-columns.html ?

вообще приведите test case подскажу может как обойти я без него не соображу пока что именно не срабатывает.



--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
11 ноя 20, 18:41    [22230355]     Ответить | Цитировать Сообщить модератору
 Re: Автогенерируемые столбцы наследуются как обычные негенерируемые  [new]
Cyrax_02
Member

Откуда:
Сообщений: 1396
big-trot
Cyrax_02,
Если я правильно понял вопрос, то что мешает создать в наследуемой таблице для поля отвечающего за автогенерацию умолчательное заполнение по сиквенсу созданному для базовой таблицы.
Речь не о последовательностях, а о генерируемых столбцах.
Так в PostgreSQL ещё и наследование последовательностей не работает ?

Maxim Boguk
вообще приведите test case подскажу может как обойти я без него не соображу пока что именно не срабатывает.
CREATE TABLE test(id int NOT NULL, gen int GENERATED ALWAYS AS (id + 1) STORED);
INSERT INTO test VALUES(1);
SELECT * FROM test;            -- 1 | 2 (OK)

CREATE TABLE test_inherit_1() INHERITS (test); 
INSERT INTO test_inherit_1 VALUES(1);
SELECT * FROM test_inherit_1;  -- 1 | 2 (OK)

CREATE TABLE test_inherit_2(id int NOT NULL, gen int); 
ALTER TABLE test_inherit_2 INHERIT test;
INSERT INTO test_inherit_2 VALUES(1);
SELECT * FROM test_inherit_2;  -- 1 | NULL (поле "gen" обычное, не генерируемое)

DROP TABLE test;
DROP TABLE test_inherit_1;
DROP TABLE test_inherit_2;

P.S. Плюс остаётся в силе вопрос №2:
> 2) Как в уже созданной таблице изменить выражение для вычисления значения генерируемого столбца без его пересоздания ?
12 ноя 20, 01:27    [22230522]     Ответить | Цитировать Сообщить модератору
 Re: Автогенерируемые столбцы наследуются как обычные негенерируемые  [new]
Melkij
Member

Откуда: Санкт-Петербург
Сообщений: 1181
Написал в -hackers, по-видимому недосмотрели в коде добавления уже существующей таблицы в наследование. Я бы предположил что

CREATE TABLE test_inherit_2(id int NOT NULL, gen int); 
ALTER TABLE test_inherit_2 INHERIT test;

станет невозможным после исправления (добавления проверки там где сейчас её нет, вернее сказать). Генерируемые поля необходимо будет объявить с аналогичным вычисляемым выражением.

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

На данный момент никак.
12 ноя 20, 13:46    [22230727]     Ответить | Цитировать Сообщить модератору
 Re: Автогенерируемые столбцы наследуются как обычные негенерируемые  [new]
Cyrax_02
Member

Откуда:
Сообщений: 1396
автор
станет невозможным после исправления (добавления проверки там где сейчас её нет, вернее сказать). Генерируемые поля необходимо будет объявить с аналогичным вычисляемым выражением.
Это не проблема. Главное - чтобы столбец стал генерируемым после установления наследования.
И чтобы выражение генерации производной таблицы менялось вместе с выражением генерации базовой таблицы (если будет добавлена возможность изменения такого выражения).
12 ноя 20, 14:05    [22230751]     Ответить | Цитировать Сообщить модератору
 Re: Автогенерируемые столбцы наследуются как обычные негенерируемые  [new]
Cyrax_02
Member

Откуда:
Сообщений: 1396
Было бы гораздо удобнее и логичнее, если наследование FK и индексов (построенных исключительно на наследуемых столбцах) было реализовано на опциональном уровне. Здесь возникают два вопроса:

1) Если CHECK-ограничения на поле наследуются, то почему не наследуются внешние ключи ? (причина X, которая противоречит логике Y)
2) Если не наследуются внешние ключи, тогда почему наследуются CHECK-ограничения на поле ? (причина Y, которая противоречит логике X)

А коли так, то получается нехорошо...

Сообщение было отредактировано: 15 ноя 20, 01:16
15 ноя 20, 01:20    [22232239]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить