Postgres9.5以降
IF NOT EXISTS
CREATE SEQUENCE
に追加されました Postgres9.5で。これが今の簡単な解決策です:
CREATE SEQUENCE IF NOT EXISTS myschema.myseq;
しかし、とにかく時代遅れの答えの詳細を考慮してください...
そしてあなたはserial
について知っています またはIDENTITY
列ですよね?
- テーブル列の自動インクリメント
Postgres9.4以前
シーケンスは、名前空間を他のいくつかのテーブルのようなオブジェクトと共有します。マニュアル:
シーケンス名は、他のシーケンス、テーブル、インデックス、ビュー、または外部テーブルの名前とは異なる必要があります 同じスキーマ内。
大胆な強調鉱山。したがって、3つのケースがあります:
- 名前が存在しません。 ->シーケンスを作成します。
- 同じ名前のシーケンスが存在します。 ->何もしませんか?出力はありますか?ロギングはありますか?
- 同じ名前の他の競合するオブジェクトが存在します。 ->何かしますか?出力はありますか?ロギングはありますか?
どちらの場合も何をするかを指定します。 DO
ステートメントは次のようになります:
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$;
オブジェクトタイプ(relkind
)pg_class
で マニュアルによると:
r=通常のテーブル
i=インデックス
S=シーケンス
v=ビュー
m=マテリアライズドビュー
c=複合型
t=TOASTテーブル
f=外部テーブル
関連:
- 特定のスキーマにテーブルが存在するかどうかを確認する方法