PostgreSQL: скопировать таблицу вместе с данными

Категория: Postgresql · Язык: SQL · Обновлено:

Скопировать структуру и строки таблицы в PostgreSQL можно командой CREATE TABLE new_table AS TABLE old_table. Этот короткий способ переносит данные и вычисляемые значения, но не копирует индексы, ограничения и триггеры; для структуры используйте LIKE.

Создать копию со строками

SQL
CREATE TEMP TABLE source_items (id int PRIMARY KEY, title text NOT NULL);
INSERT INTO source_items VALUES (1, 'Первый'), (2, 'Второй');

CREATE TEMP TABLE items_copy AS TABLE source_items;
SELECT count(*) FROM items_copy;
-- результат: 2

CREATE TABLE AS выводит столбцы и данные результата, но не переносит все свойства исходной таблицы.

Скопировать структуру и ограничения

SQL
CREATE TEMP TABLE source_items (id int PRIMARY KEY, title text NOT NULL);
INSERT INTO source_items VALUES (1, 'Первый'), (2, 'Второй');
CREATE TEMP TABLE items_structure (LIKE source_items INCLUDING ALL);
INSERT INTO items_structure SELECT * FROM source_items;

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

Только структуру или только данные

SQL
CREATE TEMP TABLE source_items (id int PRIMARY KEY, title text NOT NULL);
INSERT INTO source_items VALUES (1, 'Первый'), (2, 'Второй');
CREATE TEMP TABLE empty_copy AS TABLE source_items WITH NO DATA;
CREATE TEMP TABLE data_copy (LIKE source_items);
INSERT INTO data_copy SELECT * FROM source_items;

Цель

Способ

Быстрая копия результата и строк

CREATE TABLE ... AS TABLE ...

Скопировать структуру таблицы

CREATE TABLE ... (LIKE ... INCLUDING ALL)

Структура без строк

WITH NO DATA или LIKE

Перенести таблицу в другую базу?

SQL-команда CREATE TABLE AS работает внутри текущего подключения. Для межбазового переноса используйте pg_dump/pg_restore, COPY через файл или проверенное расширение postgres_fdw.