
В PostgreSQL копирование таблицы часто требуется при тестировании изменений, резервном копировании или переносе данных между схемами. Система поддерживает несколько способов создания копий, отличающихся по глубине и составу данных. Выбор подхода зависит от того, нужно ли сохранить структуру, данные, индексы или ограничения.
Наиболее распространённый вариант – использование команды CREATE TABLE AS, которая создаёт новую таблицу на основе результата запроса. Этот метод подходит для частичного или полного дублирования данных. Если требуется только структура без содержимого, можно воспользоваться оператором CREATE TABLE … (LIKE …), который повторяет схему исходной таблицы.
При клонировании таблиц с большим объёмом данных следует учитывать нагрузку на систему. Полное копирование через SELECT INTO создаёт таблицу мгновенно, но может временно блокировать ресурсы. Для копирования таблицы между базами данных можно использовать утилиты pg_dump и psql, что удобно при переносе данных между серверами.
Создание копии таблицы с помощью команды CREATE TABLE AS
Команда CREATE TABLE AS используется для создания новой таблицы на основе данных существующей. Она позволяет скопировать как всю таблицу целиком, так и только её часть, определённую с помощью запроса SELECT. Новый объект получает структуру, соответствующую результату запроса, включая типы данных и порядок столбцов.
Базовый синтаксис команды:
CREATE TABLE новая_таблица AS
SELECT * FROM исходная_таблица;
Эта форма создаёт копию таблицы с теми же данными, что и в исходной. Индексы, ограничения и последовательности не переносятся – их нужно создавать отдельно.
Чтобы скопировать только структуру без строк, можно добавить условие, исключающее данные:
CREATE TABLE новая_таблица AS
SELECT * FROM исходная_таблица WHERE false;
Для частичного копирования удобно использовать фильтрацию или выбор конкретных столбцов:
CREATE TABLE архив_за_2024 AS
SELECT id, дата, сумма FROM продажи WHERE дата < '2025-01-01';
Рекомендации при использовании:
- Проверять права пользователя на создание таблиц в текущей схеме.
- После копирования вручную добавить индексы и первичные ключи, если они требуются.
- При копировании больших таблиц использовать фильтрацию и временные схемы для снижения нагрузки.
- Переименовывать таблицы сразу после создания, чтобы избежать конфликтов имён при повторных операциях.
Клонирование структуры таблицы без данных

Чтобы создать копию таблицы без строк, в PostgreSQL применяют конструкцию CREATE TABLE новая_таблица (LIKE исходная_таблица). Она копирует схему, включая имена столбцов и их типы. Такой способ удобен при подготовке тестовых таблиц или временных структур для последующего импорта данных.
Пример команды:
CREATE TABLE отчеты_шаблон (LIKE отчеты);
По умолчанию копируются только столбцы. Чтобы перенести индексы, ограничения, значения по умолчанию и комментарии, добавляют опции INCLUDING:
CREATE TABLE отчеты_шаблон (LIKE отчеты INCLUDING DEFAULTS INCLUDING CONSTRAINTS INCLUDING INDEXES);
Если требуется только структура без дополнительных свойств, опции можно не указывать. При этом новая таблица не содержит данных и не наследует зависимые объекты, такие как последовательности или внешние ключи.
Рекомендации:
- При копировании таблиц с автоинкрементными полями создавайте отдельные последовательности, иначе новые записи будут конфликтовать с исходной таблицей.
- Проверяйте совпадение типов данных, особенно при клонировании таблиц из старых схем с пользовательскими типами.
- Для упрощения работы с шаблонами можно использовать схемы, в которых хранятся только таблицы-образцы без данных.
Копирование таблицы вместе с индексами и ограничениями

В PostgreSQL для создания полной копии таблицы, включающей индексы, ограничения и значения по умолчанию, используется оператор CREATE TABLE … (LIKE … INCLUDING …). Эта конструкция позволяет сохранить структуру исходной таблицы максимально точно, без переноса данных.
Пример команды, копирующей таблицу со всеми связанными объектами:
CREATE TABLE копия_заказов (LIKE заказы INCLUDING ALL);
Опция INCLUDING ALL объединяет все доступные параметры: DEFAULTS, CONSTRAINTS, INDEXES, STORAGE, COMMENTS, STATISTICS. При необходимости можно указать только нужные элементы.
Основные опции копирования:
| Опция | Описание |
|---|---|
| INCLUDING DEFAULTS | Переносит значения по умолчанию для столбцов |
| INCLUDING CONSTRAINTS | Копирует ограничения NOT NULL, CHECK и UNIQUE |
| INCLUDING INDEXES | Создаёт копии индексов исходной таблицы |
| INCLUDING COMMENTS | Переносит комментарии к таблице и столбцам |
| INCLUDING STORAGE | Сохраняет параметры хранения данных |
| INCLUDING STATISTICS | Копирует настройки сбора статистики |
После создания структуры можно добавить данные вручную или через запрос INSERT INTO … SELECT для сохранения содержимого:
INSERT INTO копия_заказов SELECT * FROM заказы;
Рекомендации:
- Проверять наличие внешних ключей – они не копируются, если ссылаются на другие таблицы.
- Создавать новую последовательность для полей с типом SERIAL или BIGSERIAL, чтобы избежать пересечений идентификаторов.
- После копирования выполнить ANALYZE для обновления статистики оптимизатора.
Дублирование таблицы через оператор SELECT INTO
Оператор SELECT INTO в PostgreSQL создаёт новую таблицу и сразу заполняет её результатом выборки. Такой способ подходит для быстрого копирования данных без необходимости предварительно определять структуру. Новая таблица формируется с типами столбцов, совпадающими с результатом запроса.
Пример полной копии таблицы:
SELECT * INTO копия_товаров FROM товары;
Команда создаёт таблицу копия_товаров и переносит все строки из исходной. Индексы и ограничения не копируются, поэтому их нужно создавать вручную, если они требуются для дальнейшей работы.
Чтобы скопировать только структуру без данных, можно добавить условие, исключающее строки:
SELECT * INTO шаблон_товаров FROM товары WHERE false;
Для выборочного копирования данных допускается использование фильтров и преобразований:
SELECT id, цена, категория INTO архив_товаров
FROM товары WHERE дата_обновления < '2025-01-01';
Рекомендации:
- Указывать уникальные имена новых таблиц, чтобы избежать конфликтов в схеме.
- Создавать индексы и ключи после копирования, если они требуются для оптимизации запросов.
- Использовать этот метод при временном дублировании больших таблиц, так как операция выполняется быстро и не требует дополнительных инструкций.
- Для постоянных копий предпочтительно применять CREATE TABLE AS, так как он предоставляет больше возможностей по настройке структуры.
Создание копии таблицы из другой базы данных PostgreSQL
PostgreSQL не поддерживает прямое копирование таблицы между базами данных, но операция выполняется с помощью инструментов pg_dump и psql. Такой способ сохраняет структуру, данные и зависимости таблицы, что позволяет перенести объект без потерь.
Чтобы скопировать таблицу из одной базы в другую, используют последовательность действий:
pg_dump -t имя_таблицы исходная_база > table.sql
psql целевая_база < table.sql
Команда pg_dump экспортирует структуру и данные выбранной таблицы в SQL-файл. Затем утилита psql выполняет этот файл в целевой базе данных, создавая копию таблицы.
Если необходимо перенести только структуру без строк, используется флаг —schema-only:
pg_dump -t имя_таблицы --schema-only исходная_база > структура.sql
psql целевая_база < структура.sql
Для копирования между удалёнными серверами можно передавать данные через поток:
pg_dump -t имя_таблицы -h сервер1 -U пользователь | psql -h сервер2 -U пользователь целевая_база
Рекомендации:
- Перед переносом убедиться, что версии PostgreSQL на исходном и целевом серверах совпадают.
- Если в таблице есть внешние ключи, сначала перенести связанные таблицы, чтобы сохранить целостность данных.
- Проверить права пользователя в целевой базе – без разрешения на создание объектов операция завершится с ошибкой.
- После импорта выполнить VACUUM ANALYZE для обновления статистики и оптимизации запросов.
Проверка и сравнение данных после копирования таблицы

После создания копии таблицы важно убедиться, что структура и содержимое совпадают с исходной. Для проверки количества строк используют запрос:
SELECT COUNT(*) FROM исходная_таблица;
SELECT COUNT(*) FROM копия_таблицы;
Если количество строк совпадает, переходят к проверке соответствия данных. Для выявления различий применяют запрос с оператором EXCEPT:
SELECT * FROM исходная_таблица
EXCEPT
SELECT * FROM копия_таблицы;
Аналогично можно проверить строки, которые присутствуют в копии, но отсутствуют в исходной:
SELECT * FROM копия_таблицы
EXCEPT
SELECT * FROM исходная_таблица;
Для больших таблиц рекомендуется использовать агрегатные функции и хэширование для ускорения сравнения:
SELECT md5(array_agg(t.*)::text) FROM исходная_таблица t;
SELECT md5(array_agg(t.*)::text) FROM копия_таблицы t;
Рекомендации:
- Проверять индексы и ограничения после копирования, чтобы убедиться в сохранении уникальности и связей.
- Для частичных копий данных использовать фильтры, чтобы сравнивать только соответствующие подмножества строк.
- При обнаружении несоответствий анализировать типы данных и порядок столбцов, они могут влиять на точность сравнения.
- В случае регулярного копирования рекомендуется автоматизировать проверку с помощью скриптов и отчетов, фиксирующих различия.
Вопрос-ответ:
Какая разница между CREATE TABLE AS и SELECT INTO при копировании таблицы?
Команда CREATE TABLE AS создаёт новую таблицу на основе результата запроса и позволяет дополнительно контролировать структуру и формат данных. SELECT INTO создаёт таблицу и сразу заполняет её результатом выборки, но не сохраняет индексы, ограничения и последовательности. CREATE TABLE AS более гибкий для сложных сценариев, а SELECT INTO удобен для быстрого дублирования данных.
Можно ли скопировать таблицу вместе с индексами и внешними ключами?
Да, для индексов и ограничений используют опцию INCLUDING при создании новой таблицы через CREATE TABLE … (LIKE …). Индексы и ограничения будут воспроизведены в новой таблице. Внешние ключи, ссылающиеся на другие таблицы, не копируются автоматически и требуют ручного добавления.
Как создать копию таблицы только с её структурой, без данных?
Для копирования структуры используют конструкцию CREATE TABLE новая_таблица (LIKE исходная_таблица). По умолчанию будут скопированы только столбцы с типами данных. При необходимости можно добавить INCLUDING CONSTRAINTS и INCLUDING DEFAULTS для сохранения ограничений и значений по умолчанию.
Как перенести таблицу из одной базы данных PostgreSQL в другую?
Для переноса используют комбинацию утилит pg_dump и psql. Команда pg_dump -t имя_таблицы исходная_база > table.sql создаёт SQL-файл с данными и структурой таблицы, затем psql целевая_база < table.sql выполняет этот файл в другой базе. Для структуры без данных используют флаг —schema-only.
Как проверить, что копия таблицы содержит те же данные, что и исходная?
Сначала проверяют количество строк с помощью SELECT COUNT(*). Затем сравнивают данные с оператором EXCEPT, чтобы найти строки, которых нет в другой таблице. Для больших таблиц можно использовать агрегаты и хэш-функции, например md5(array_agg(t.*)::text), чтобы ускорить сравнение.
