Postgres 9.5 atau lebih baru
IF NOT EXISTS
telah ditambahkan ke CREATE SEQUENCE
di Postgres 9.5. Itulah solusi sederhananya sekarang:
CREATE SEQUENCE IF NOT EXISTS myschema.myseq;
Tetapi pertimbangkan detail dari jawaban yang sudah ketinggalan zaman ...
Dan Anda tahu tentang serial
atau IDENTITY
kolom, kan?
- Kolom tabel kenaikan otomatis
Postgres 9.4 atau lebih lama
Urutan berbagi namespace dengan beberapa objek seperti tabel lainnya. Panduan:
Nama urutan harus berbeda dari namaurutan, tabel, indeks, tampilan, atau tabel asing lainnya lainnya dalam skema yang sama.
Penekanan saya yang berani. Jadi ada tiga kasus:
- Nama tidak ada. -> Buat urutan.
- Urutan dengan nama yang sama ada. -> Tidak melakukan apa-apa? Keluaran apa saja? Ada pencatatan?
- Objek lain yang bertentangan dengan nama yang sama ada. -> Lakukan sesuatu? Keluaran apa saja? Ada pencatatan?
Tentukan apa yang harus dilakukan dalam kedua kasus tersebut. Sebuah DO
pernyataan bisa terlihat seperti ini:
DO
$do$
DECLARE
_kind "char";
BEGIN
SELECT relkind
FROM pg_class
WHERE oid = 'myschema.myseq'::regclass -- sequence name, optionally schema-qualified
INTO _kind;
IF NOT FOUND THEN -- name is free
CREATE SEQUENCE myschema.myseq;
ELSIF _kind = 'S' THEN -- sequence exists
-- do nothing?
ELSE -- object name exists for different kind
-- do something!
END IF;
END
$do$;
Jenis objek (relkind
) di pg_class
sesuai dengan manual:
r =tabel biasa
i =indeks
S =urutan
v =tampilan
m =tampilan terwujud
c =tipe komposit
t =tabel TOAST
f =tabel asing
Terkait:
- Cara memeriksa apakah ada tabel dalam skema tertentu