2009-08-03 10 views

Odpowiedz

10

Spójrz na pgAdmin - zdecydowanie najłatwiej zrobić to, co chcesz.
Kliknij prawym przyciskiem myszy tabelę, Skrypty - Utwórz.

+0

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

+0

Wystarczająco fair. W phpPgAdmin: przejdź do tabeli, kliknij Eksportuj, wybierz "Tylko struktura" i masz swój skrypt – ChssPly76

+0

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

40

Cóż, najbliżej można dostać się z SQL jest:

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

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

Innym sposobem jest zrzucić strukturę tabeli, należy zmienić jego nazwę na wysypisko, i załadować go ponownie:

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

Ale uwaga, że ​​takie uproszczone sed będzie również zmienić stare na nowe w innych miejscach (na przykład jeśli masz w kolumnie tabeli o nazwie "is_scolded", to stanie się "is_cnewed").

Pytanie brzmi raczej: dlaczego jest to potrzebne - ponieważ do różnych celów używałbym różnych technik.

+0

Uwaga: 'zawierający ograniczenia' nie działa na PostgreSQL 8.3 – Ragnar123

+1

Działa jak urok w Postgresie 9.3 :) – Ganapathy

+7

Najlepsza odpowiedź. Po prostu pamiętaj, że jeśli masz "seryjną" wartość lub jakąś inną kolumnę przypisaną do sekwencji, użyje ona tej samej sekwencji co stara tabela! Więc jeśli wstawisz rzeczy do obu tabel, zwiększy się dla obu. – sudo

23

Aby uzyskać prostą kopię schematu, należy użyć klauzuli "like".

CREATE TABLE new_table_name (like old_table_name including all) 
5

Jak o

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

postgresql.org answer

+1

Niestety, nie zachowuje to kluczy, wiązań ani ustawień domyślnych. – sudo

+1

Lepszym sposobem na wyrażenie "WHERE 1 = 2" byłoby "WHERE false" lub brak klauzuli WHERE, ale zamiast tego "LIMIT 0". –

Powiązane problemy