Skopiuj strukturę tabeli do nowej tabeli


91

Czy istnieje sposób na skopiowanie struktury tabeli do nowej tabeli bez danych, w tym wszystkich kluczy i ograniczeń?

Odpowiedzi:


107

W przypadku prostej kopii schematu użyj klauzuli like.

CREATE TABLE new_table_name ( like old_table_name including all)

13
Warto zauważyć, że możesz również dodać nowe kolumny, używając podobnej składni:CREATE TABLE new (like old, extra_column text);
Brad Koch

@BradKoch czy można dodać dodatkowe ograniczenia w tym zestawieniu? A może osobny?
Andrey Deineko

@AndreyDeineko To zależy, szczegółowe informacje znajdziesz w dokumentacji tworzenia tabeli . Za pomocą tej składni można łatwo dodać ograniczenia dotyczące sprawdzania i klucza obcego, tak jak w przypadku każdej innej instrukcji create, ale nie jestem pewien, czy ograniczenia na poziomie kolumny, takie jak not null, można zastosować bez późniejszej zmiany.
Brad Koch

2
Przed chwilą próbowałem. Nie skopiowałem ograniczeń i wyzwalaczy klucza obcego (PostgreSQL 9.2).
Jānis Elmeris

73

Cóż, najbliższy SQL to:

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

Ale nie skopiuje wszystkiego. Najważniejsze rzeczy, których brakuje, to KLUCZE OBCE. Również - wyzwalacze również nie są kopiowane. Nie jestem pewien innych rzeczy.

Innym sposobem jest zrzucenie struktury tabeli, zmiana jej nazwy w dump i ponowne załadowanie:

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

Ale uwaga, taki uproszczony sed zmieni się również ze starego na nowy w innych miejscach (na przykład jeśli masz w swojej tabeli kolumnę o nazwie „is_scolded”, stanie się ona „is_scnewed”).

Pytanie tak naprawdę brzmi raczej: po co ci to potrzebne - ponieważ do różnych celów użyłbym różnych technik.


Uwaga: including constraintsnie działa na PostgreSQL 8.3
Ragnar123

1
Działał jak urok w Postgres 9.3 :)
Ganapathy

14
Najlepsza odpowiedź. Tylko uważaj, jeśli masz wartość „seryjną” lub inną kolumnę domyślną dla sekwencji, użyje ona tej samej sekwencji, co w starej tabeli! Więc jeśli wstawisz coś do jednej z tabel, zwiększy się dla obu.
sudo

19

Aby całkowicie skopiować tabelę, można również użyć krótkiego formularza za pomocą polecenia TABELA:

CREATE TABLE films2 AS
    TABLE films
    WITH NO DATA;

Więcej szczegółów tutaj


Niestety to również kopiuje dane - z tego co rozumiem, pytanie dotyczy kopiowania samego schematu
Jasmine

Identyfikatory 🙁 mają wartość NULL w nowej tabeli i nie kopiują wartości domyślnych.
ilhan

10

Spójrz na pgAdmin - zdecydowanie najłatwiejszy sposób robienia tego, co chcesz.
Kliknij prawym przyciskiem myszy tabelę, Skrypty - Utwórz.


Mam tylko dostęp do phpPgAdmin; Nie jestem właścicielem serwera.
Alex S,

Słusznie. W phpPgAdmin: przejdź do tabeli, kliknij Eksportuj, wybierz „Tylko struktura” i masz swój skrypt
ChssPly76

Jestem prawie pewien, że musi to być błąd w tej instalacji - po prostu pokazuje pustą stronę w prawej ramce, kiedy to robię: /
Alex S

1
Czy wypróbowałeś obie opcje „pokaż” lub „pobierz”? Jeśli oba nie działają, to tak, może to być błąd. Jeśli tak, musisz to zrobić przez SQL, spójrz na link w odpowiedzi Dav.
ChssPly76

Pobieranie daje mi tylko pusty plik.
Alex S

6

Co powiesz na

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

odpowiedź postgresql.org


3
Niestety, nie zachowuje to kluczy, ograniczeń ani ustawień domyślnych.
sudo

1
Lepszym sposobem wyrażenia „WHERE 1 = 2” byłoby „WHERE false” lub brak klauzuli WHERE, ale zamiast tego „LIMIT 0”.
Kenyakorn Ketsombut
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.