Dalam skrip MySQL Anda dapat menulis:
CREATE TABLE IF NOT EXISTS foo ...;
... hal-hal lain ...
dan kemudian Anda bisa menjalankan skrip berkali-kali tanpa membuat ulang tabel.
Bagaimana Anda melakukannya di PostgreSQL?
sumber
Dalam skrip MySQL Anda dapat menulis:
CREATE TABLE IF NOT EXISTS foo ...;
... hal-hal lain ...
dan kemudian Anda bisa menjalankan skrip berkali-kali tanpa membuat ulang tabel.
Bagaimana Anda melakukannya di PostgreSQL?
Fitur ini telah diterapkan di Postgres 9.1 :
CREATE TABLE IF NOT EXISTS myschema.mytable (i integer);
Untuk versi yang lebih lama , ini adalah fungsi untuk mengatasinya:
CREATE OR REPLACE FUNCTION create_mytable ()
RETURNS void AS
$func$
BEGIN
IF EXISTS (SELECT FROM pg_catalog.pg_tables
WHERE schemaname = 'myschema'
AND tablename = 'mytable') THEN
RAISE NOTICE 'Table myschema.mytable already exists.';
ELSE
CREATE TABLE myschema.mytable (i integer);
END IF;
END
$func$ LANGUAGE plpgsql;
Panggilan:
SELECT create_mytable(); -- call as many times as you want.
Catatan:
Kolom schemaname
dan tablename
in pg_tables
adalah case-sensitive. Jika Anda mengutip ganda pengidentifikasi dalam CREATE TABLE
pernyataan, Anda harus menggunakan ejaan yang sama persis. Jika tidak, Anda harus menggunakan string huruf kecil. Lihat:
pg_tables
hanya berisi tabel aktual . Pengidentifikasi mungkin masih ditempati oleh objek terkait. Lihat:
Jika peran yang menjalankan fungsi ini tidak memiliki hak istimewa yang diperlukan untuk membuat tabel, Anda mungkin ingin menggunakan SECURITY DEFINER
untuk fungsi dan membuatnya dimiliki oleh peran lain dengan hak istimewa yang diperlukan. Versi ini cukup aman.
CREATE FUNCTION
hanya sekali. MungkinSELECT create_mytable();
Anda ingin menelepon berkali-kali.Coba ini:
sumber
IF NOT EXISTS
opsi.Saya membuat solusi umum dari jawaban yang ada yang dapat digunakan kembali untuk tabel apa pun:
Pemakaian:
Itu bisa disederhanakan lebih lanjut untuk mengambil hanya satu parameter jika seseorang akan mengekstrak nama tabel dari parameter kueri. Saya juga meninggalkan skema.
sumber
Solusi ini agak mirip dengan jawaban oleh Erwin Brandstetter, tetapi hanya menggunakan bahasa sql.
Tidak semua instalasi PostgreSQL memiliki bahasa plpqsql secara default, ini berarti Anda mungkin harus memanggil
CREATE LANGUAGE plpgsql
sebelum membuat fungsi, dan setelah itu harus menghapus bahasa lagi, untuk meninggalkan database dalam keadaan yang sama seperti sebelumnya (tetapi hanya jika database tidak memiliki bahasa plpgsql untuk memulai). Lihat bagaimana kompleksitas tumbuh?Menambahkan plpgsql mungkin tidak menjadi masalah jika Anda menjalankan skrip Anda secara lokal, namun, jika skrip digunakan untuk mengatur skema di pelanggan, mungkin tidak diinginkan untuk meninggalkan perubahan seperti ini di database pelanggan.
Solusi ini terinspirasi oleh posting oleh Andreas Scherbaum .
sumber
Tidak ada CREATE TABLE JIKA TIDAK ADA ... tetapi Anda dapat menulis prosedur sederhana untuk itu, sesuatu seperti:
sumber
Tidak ada CREATE TABLE JIKA TIDAK ADA ... tetapi Anda dapat menulis prosedur sederhana untuk itu, sesuatu seperti:
sumber