Скопіюйте структуру таблиці в нову таблицю


91

Чи є спосіб скопіювати структуру таблиці в нову таблицю без даних, включаючи всі ключі та обмеження?

Відповіді:


107

Для простої копії схеми використовуйте подібне речення.

CREATE TABLE new_table_name ( like old_table_name including all)

13
Варто зазначити, що ви також можете додавати нові стовпці, використовуючи подібний синтаксис:CREATE TABLE new (like old, extra_column text);
Бред Кох

@BradKoch чи можна додати додаткові обмеження в цей вислів? Або це має бути окремий?
Андрій Дейнеко

@AndreyDeineko Це залежить, перевірте повну інформацію про створення таблиць . Ви можете легко додати обмеження перевірки та зовнішнього ключа, використовуючи цей синтаксис, як і будь-який інший оператор створення, але я не впевнений, чи можна застосовувати обмеження рівня стовпців типу not null без подальшої зміни.
Бред Кох,

2
Спробував щойно. Не скопійовано обмеження та активатори зовнішнього ключа (PostgreSQL 9.2).
Яніс Елмеріс

73

Ну, найближче, що ви можете отримати з SQL:

create table new (
    like old
    including defaults
    including constraints
    including indexes
);

Але це не все скопіює. Найголовніше, чого не вистачає, це ІНОЗЕМНІ КЛЮЧІ. Також - тригери також не копіюються. Не впевнений в інших речах.

Інший спосіб - скинути структуру таблиці, змінити її назву в дамп і завантажити знову:

pg_dump -s -t old databases | sed 's/old/new/g' | psql

Але будьте обережні, що такий спрощений sed також змінить старий на новий в інших місцях (наприклад, якщо у вашій таблиці є стовпець з назвою "is_scolded", він стане "is_scnewed").

Питання насправді полягає швидше: навіщо це вам потрібно - адже для різних цілей я б використовував різні техніки.


Примітка: including constraintsне працює на PostgreSQL 8.3
Ragnar123

1
Працював як шарм у Postgres 9.3 :)
Ganapathy

14
Краща відповідь. Тільки майте на увазі, що якщо у вас є "послідовне" значення або якийсь інший стовпець, який за замовчуванням є послідовністю, він буде використовувати ту ж послідовність, що і стара таблиця! Отже, якщо ви вставите матеріал у будь-яку таблицю, він збільшиться для обох.
sudo

19

Щоб повністю скопіювати таблицю, також можна використовувати коротку форму за допомогою команди TABLE:

CREATE TABLE films2 AS
    TABLE films
    WITH NO DATA;

Детальніше тут


На жаль, це також копіює дані - наскільки я розумію, питання полягає в копіюванні лише схеми
Жасмін

🙁 ідентифікатори NULL в новій таблиці і не копіюють значення за замовчуванням.
Ілхан

10

Погляньте на pgAdmin - на сьогоднішній день найпростіший спосіб робити те, що хочете.
Клацніть правою кнопкою миші на таблиці, Сценарії - Створити.


Я маю доступ лише до phpPgAdmin; Я не володію сервером.
Alex S

Справедливо. У phpPgAdmin: перейдіть до таблиці, натисніть Експорт, виберіть "Лише структура" і ваш скрипт
ChssPly76

Я майже впевнений, що вони повинні бути помилкою в цій установці - вона просто показує порожню сторінку в правому кадрі, коли я це роблю: /
Alex S

1
Ви пробували обидва варіанти "показати" або "завантажити"? Якщо обидва не працюють, тоді так, це може бути помилка. Якщо так, то вам потрібно буде це зробити через SQL, подивіться на посилання у відповіді Дава.
ChssPly76

Завантаження просто дає мені порожній файл.
Alex S

6

Як на рахунок

CREATE TABLE sample_table_copy AS (SELECT * FROM sample_table WHERE 1 = 2)

відповідь postgresql.org


3
На жаль, це не зберігає ключі, обмеження та за замовчуванням.
sudo

1
Кращим способом виразити "WHERE 1 = 2" буде "WHERE false" або взагалі відсутні умови WHERE, а замість цього "LIMIT 0".
Kenyakorn Ketsombut
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.