powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Автогенерируемые столбцы наследуются как обычные негенерируемые
8 сообщений из 8, страница 1 из 1
Автогенерируемые столбцы наследуются как обычные негенерируемые
    #40016853
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 ) Как в уже созданной таблице изменить выражение генерации значения автогенерируемого столбца без его пересоздания ?
...
Рейтинг: 0 / 0
Автогенерируемые столбцы наследуются как обычные негенерируемые
    #40016868
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Судя по всему, проблема №1 является следствием проблемы №2...
...
Рейтинг: 0 / 0
Автогенерируемые столбцы наследуются как обычные негенерируемые
    #40017277
big-trot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cyrax_02,

Если я правильно понял вопрос, то что мешает создать в наследуемой таблице для поля отвечающего за автогенерацию умолчательное заполнение по сиквенсу созданному для базовой таблицы.
...
Рейтинг: 0 / 0
Автогенерируемые столбцы наследуются как обычные негенерируемые
    #40017316
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02
Судя по всему, проблема №1 является следствием проблемы №2...


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

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



--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Автогенерируемые столбцы наследуются как обычные негенерируемые
    #40017397
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
big-trot
Cyrax_02,
Если я правильно понял вопрос, то что мешает создать в наследуемой таблице для поля отвечающего за автогенерацию умолчательное заполнение по сиквенсу созданному для базовой таблицы.
Речь не о последовательностях, а о генерируемых столбцах .
Так в PostgreSQL ещё и наследование последовательностей не работает ?

Maxim Boguk вообще приведите test case подскажу может как обойти я без него не соображу пока что именно не срабатывает.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
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) Как в уже созданной таблице изменить выражение для вычисления значения генерируемого столбца без его пересоздания ?
...
Рейтинг: 0 / 0
Автогенерируемые столбцы наследуются как обычные негенерируемые
    #40017503
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Написал в -hackers, по-видимому недосмотрели в коде добавления уже существующей таблицы в наследование. Я бы предположил что

Код: sql
1.
2.
CREATE TABLE test_inherit_2(id int NOT NULL, gen int); 
ALTER TABLE test_inherit_2 INHERIT test;


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

Как в уже созданной таблице изменить выражение для вычисления значения генерируемого столбца без его пересоздания ?
На данный момент никак.
...
Рейтинг: 0 / 0
Автогенерируемые столбцы наследуются как обычные негенерируемые
    #40017514
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторстанет невозможным после исправления (добавления проверки там где сейчас её нет, вернее сказать). Генерируемые поля необходимо будет объявить с аналогичным вычисляемым выражением.Это не проблема. Главное - чтобы столбец стал генерируемым после установления наследования.
И чтобы выражение генерации производной таблицы менялось вместе с выражением генерации базовой таблицы (если будет добавлена возможность изменения такого выражения).
...
Рейтинг: 0 / 0
Автогенерируемые столбцы наследуются как обычные негенерируемые
    #40018412
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Было бы гораздо удобнее и логичнее, если наследование FK и индексов (построенных исключительно на наследуемых столбцах) было реализовано на опциональном уровне. Здесь возникают два вопроса:

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

А коли так, то получается нехорошо...
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Автогенерируемые столбцы наследуются как обычные негенерируемые
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]