Задать вопрос
Delgus
@Delgus

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

Изучаю документацию Postgres.
https://postgrespro.ru/docs/postgresql/10/sql-crea...

Там написано следующее

Характеристика идентификации в определении скопированного столбца будет копироваться, только если в команде есть указание INCLUDING IDENTITY. Для каждого столбца идентификации в новой таблице создаётся новая последовательность, независящая от последовательностей, связанных со старой таблицей.


И я подумал что если не указывать including identity то создаётся новая последовательность, независящая от последовательностей, связанных со старой таблицей.
Однако же когда я выполнил команду:
create table b_table (like newtable INCLUDING COMMENTS INCLUDING CONSTRAINTS INCLUDING DEFAULTS INCLUDING INDEXES);

То я получил новую таблицу где столбец id типа serial был привязан к той же последовательности(sequence) что и в старой, что меня немного удивило.
Вопросы:
1. Почему?
2. Какие механизмы еще есть для копирования структуры таблицы в Postgres? Мне просто нужно получить копию таблицы и не привязывать ее к старой.
  • Вопрос задан
  • 216 просмотров
Подписаться 1 Простой 1 комментарий
Решения вопроса 1
Melkij
@Melkij
PostgreSQL DBA
melkij=> create table identity_test (i int primary key generated by default as identity, val int);
CREATE TABLE
melkij=> insert into identity_test (val) values (1);
INSERT 0 1
melkij=> table identity_test;
 i | val 
---+-----
 1 |   1
(1 строка)

melkij=> create table identity_test_like (like identity_test INCLUDING COMMENTS INCLUDING CONSTRAINTS INCLUDING DEFAULTS INCLUDING INDEXES);
CREATE TABLE
melkij=> \d identity_test_like
                    Таблица "public.identity_test_like"
 Столбец |   Тип   | Правило сортировки | Допустимость NULL | По умолчанию 
---------+---------+--------------------+-------------------+--------------
 i       | integer |                    | not null          | 
 val     | integer |                    |                   | 
Индексы:
    "identity_test_like_pkey" PRIMARY KEY, btree (i)

melkij=> \d identity_test
                                Таблица "public.identity_test"
 Столбец |   Тип   | Правило сортировки | Допустимость NULL |           По умолчанию           
---------+---------+--------------------+-------------------+----------------------------------
 i       | integer |                    | not null          | generated by default as identity
 val     | integer |                    |                   | 
Индексы:
    "identity_test_pkey" PRIMARY KEY, btree (i)


include identity нет - identity не скопирован. Всё выглядит корректно.

Если же вы не про identity, а про синтаксический сахар serial - то его nextval был скопирован потому вы сами это попросили через INCLUDING DEFAULTS.
Типа данных serial нет. Это синтаксический сахар вокруг поля int, создания sequence и указания nextval в default.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы