Salin struktur tabel ke dalam tabel baru

91

Apakah ada cara untuk menyalin struktur tabel ke tabel baru, tanpa data, termasuk semua kunci dan pembatas?

Alex S.
sumber

Jawaban:

107

Untuk salinan skema sederhana gunakan klausa like.

CREATE TABLE new_table_name ( like old_table_name including all)
coderhs
sumber
13
Perlu dicatat, Anda juga dapat menambahkan kolom baru saat menggunakan sintaks serupa:CREATE TABLE new (like old, extra_column text);
Brad Koch
@BradKoch apakah mungkin untuk menambahkan batasan ekstra dalam pernyataan ini? Atau harus terpisah?
Andrey Deineko
@AndreyDeineko Tergantung, periksa dokumen buat tabel untuk detail selengkapnya. Anda dapat dengan mudah menambahkan batasan cek dan kunci asing menggunakan sintaks ini, seperti dengan pernyataan create lainnya, tetapi saya tidak yakin apakah batasan tingkat kolom seperti bukan nol dapat diterapkan tanpa perubahan berikutnya.
Brad Koch
2
Mencoba sekarang. Tidak menyalin batasan dan pemicu kunci asing (PostgreSQL 9.2).
Jānis Elmeris
73

Nah, hal terdekat yang bisa Anda dapatkan dengan SQL adalah:

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

Tapi itu tidak akan menyalin semuanya. Hal terpenting yang hilang adalah FOREIGN KEYs. Juga - pemicu juga tidak disalin. Tidak yakin tentang hal lain.

Cara lain adalah membuang struktur tabel, mengubah namanya di dump, dan memuatnya lagi:

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

Namun berhati-hatilah, sed sederhananya sed juga akan mengubah lama menjadi baru di tempat lain (misalnya jika Anda memiliki di kolom tabel Anda bernama "is_scolded" itu akan menjadi "is_scnewed").

Pertanyaannya sebenarnya adalah: mengapa Anda membutuhkannya - karena untuk berbagai tujuan, saya akan menggunakan teknik yang berbeda.


sumber
Catatan: including constraintstidak berfungsi pada PostgreSQL 8.3
Ragnar123
1
Bekerja seperti pesona di Postgres 9.3 :)
Ganapathy
14
Jawaban Terbaik. Berhati-hatilah jika Anda memiliki nilai "serial" atau beberapa kolom lain yang secara default berurutan, ini akan menggunakan urutan yang sama seperti tabel lama! Jadi jika Anda memasukkan barang ke salah satu tabel, itu akan bertambah untuk keduanya.
sudo
19

Untuk menyalin tabel secara lengkap, bentuk singkat menggunakan perintah TABLE juga dapat digunakan:

CREATE TABLE films2 AS
    TABLE films
    WITH NO DATA;

Lebih lengkapnya di sini

Dimo Boyadzhiev
sumber
Sayangnya ini juga menyalin data - dari apa yang saya mengerti, pertanyaannya adalah tentang hanya menyalin skema
Jasmine
ID 🙁 adalah NULL di tabel baru dan tidak menyalin nilai default.
ilhan
10

Lihatlah pgAdmin - sejauh ini cara termudah untuk melakukan apa yang Anda inginkan.
Klik kanan pada tabel, Skrip - Buat.

ChssPly76
sumber
Saya hanya memiliki akses ke phpPgAdmin; Saya bukan pemilik server.
Alex S
Cukup adil. Di phpPgAdmin: buka tabel, klik Ekspor, pilih "Hanya Struktur" dan skrip Anda sudah siap
ChssPly76
Saya cukup yakin mereka pasti ada bug dalam pemasangan ini - ini hanya menampilkan halaman kosong di bingkai kanan ketika saya melakukannya: /
Alex S
1
Apakah Anda mencoba opsi "tampilkan" atau "unduh"? Jika keduanya tidak berfungsi maka ya, itu mungkin bug. Jika demikian, Anda harus melakukannya melalui SQL, lihat tautan di jawaban Dav.
ChssPly76
Unduh hanya memberi saya file kosong.
Alex S
6

Bagaimana tentang

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

jawaban postgresql.org

picmate 涅
sumber
3
Sayangnya, ini tidak mempertahankan kunci, batasan, atau default.
sudo
1
Cara yang lebih baik untuk mengekspresikan 'WHERE 1 = 2' adalah 'WHERE false' atau tidak ada klausa WHERE sama sekali, tetapi 'LIMIT 0' sebagai gantinya.
Kenyakorn Ketsombut