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ń?

Alex S.
źródło

Odpowiedzi:

107

W przypadku prostej kopii schematu użyj klauzuli like.

CREATE TABLE new_table_name ( like old_table_name including all)
coderhs
źródło
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.


źródło
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

Dimo Boyadzhiev
źródło
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.

ChssPly76
źródło
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

picmate 涅
źródło
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