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?

Jawaban:


107

Untuk salinan skema sederhana gunakan klausa like.

CREATE TABLE new_table_name ( like old_table_name including all)

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.


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


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.


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


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.