Tablo yapısını yeni tabloya kopyala


91

Bir tablonun yapısını veriler olmadan, tüm anahtarlar ve kısıtlamalar dahil olmak üzere yeni bir tabloya kopyalamanın bir yolu var mı?

Yanıtlar:


107

Basit bir şema kopyası için like deyimini kullanın.

CREATE TABLE new_table_name ( like old_table_name including all)

13
Benzer sözdizimini kullanırken yeni sütunlar da ekleyebileceğinizi belirtmek gerekir:CREATE TABLE new (like old, extra_column text);
Brad Koch

@BradKoch bu ifadeye ekstra kısıtlamalar eklemek mümkün mü? Yoksa ayrı mı olmalı?
Andrey Deineko

@AndreyDeineko Buna bağlıdır, tüm ayrıntılar için tablo oluşturma belgelerine bakın. Bu sözdizimini kullanarak kontrol ve yabancı anahtar kısıtlamalarını kolayca ekleyebilirsiniz, tıpkı diğer create deyimlerinde olduğu gibi, ancak null değil gibi sütun düzeyi kısıtlamalarının daha sonra bir değişiklik yapılmadan uygulanıp uygulanamayacağından emin değilim.
Brad Koch

2
Şimdi denedim. Yabancı anahtar kısıtlamaları ve tetikleyicileri kopyalanmadı (PostgreSQL 9.2).
Jānis Elmeris

73

Peki, SQL ile alabileceğiniz en yakın şey:

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

Ama her şeyi kopyalamayacak. Eksik olan en önemli şeyler YABANCI ANAHTARLAR'dır. Ayrıca - tetikleyiciler de kopyalanmaz. Diğer şeylerden emin değilim.

Başka bir yol da tablo yapısını dökmek, dökümde adını değiştirmek ve tekrar yüklemektir:

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

Ancak, bu tür basit sed'in başka yerlerde de eskiyi yeniye değiştireceğine dikkat edin (örneğin, tablo sütununuzda "is_scolded" adlı sütun varsa, "is_scnewed" haline gelecektir).

Asıl soru daha çok şudur: neden buna ihtiyacınız var - çünkü çeşitli amaçlar için farklı teknikler kullanırdım.


Not: including constraintsPostgreSQL 8.3
Ragnar123

1
Postgres 9.3'te bir cazibe gibi çalıştı :)
Ganapathy

14
En iyi cevap. Bir "seri" değeriniz varsa veya bir sırayı varsayılan olarak belirleyen başka bir sütununuz varsa, eski tablo ile aynı sırayı kullanacağına dikkat edin! Yani her iki tabloya da malzeme eklerseniz, her ikisi için de artacaktır.
sudo

19

Bir tabloyu tamamen kopyalamak için, TABLE komutunu kullanan kısa form da kullanılabilir:

CREATE TABLE films2 AS
    TABLE films
    WITH NO DATA;

Daha fazla ayrıntı burada


Ne yazık ki bu, verileri de kopyalıyor
Jasmine

🙁 kimlikler yeni tabloda BOŞ'dur ve varsayılan değerleri kopyalamaz.
ilhan

10

İstediğinizi yapmanın açık ara en kolay yolu olan pgAdmin'e bir göz atın .
Tabloya sağ tıklayın, Komut Dosyaları - Oluşturun.


Sadece phpPgAdmin'e erişimim var; Sunucunun sahibi değilim.
Alex S

Yeterince adil. PhpPgAdmin'de: tabloya gidin, Dışa Aktar'a tıklayın, "Yalnızca Yapı" yı seçin ve betiğiniz hazır
ChssPly76

Bu yüklemede bir hata olması gerektiğinden oldukça eminim - bunu yaptığımda doğru çerçevede boş bir sayfa gösteriyor: /
Alex S

1
Hem "göster" hem de "indir" seçeneğini denediniz mi? Her ikisi de işe yaramazsa, evet, bir hata olabilir. Öyleyse, SQL aracılığıyla yapmanız gerekecek, Dav'un ​​cevabındaki bağlantıya bir göz atın.
ChssPly76

İndir bana boş bir dosya veriyor.
Alex S

6

Ne dersin

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

postgresql.org yanıtı


3
Ne yazık ki bu, anahtarları, kısıtlamaları veya varsayılanları korumaz.
sudo

1
'WHERE 1 = 2' ifadesini ifade etmenin daha iyi bir yolu, 'WHERE false' veya hiç WHERE cümlesi değil, bunun yerine 'LIMIT 0' olacaktır.
Kenyakorn Ketsombut
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.