更新:to_regclass()
Postgres 9.4では、存在のテストが簡単になりました。
SELECT to_regclass('schema_name.table_name');
しかし、詳細を読んでください:
完全な機能
シーケンスだけでなく、名前と競合するテーブルのようなオブジェクトをチェックする必要があります。
この関数は、名前が使用可能な場合は新しいシーケンスを作成し、それ以外の場合はそれぞれ意味のあるNOTICE
//を発行しWARNING
ます。EXCEPTION
CREATE OR REPLACE FUNCTION f_create_seq(_seq text, _schema text = NULL)
RETURNS void AS
$func$
DECLARE
_fullname text := format('%I.%I', COALESCE(_schema,current_schema),_seq);
_relkind "char" := (SELECT c.relkind
FROM pg_namespace n
JOIN pg_class c ON c.relnamespace = n.oid
WHERE n.nspname = COALESCE(_schema, current_schema)
AND c.relname = _seq);
BEGIN
IF _relkind IS NULL THEN -- name is free
EXECUTE 'CREATE SEQUENCE ' || _fullname;
RAISE NOTICE 'New sequence % created.', _fullname;
ELSIF _relkind = 'S' THEN -- 'S' = sequence
IF has_sequence_privilege(_fullname, 'USAGE') THEN
RAISE WARNING 'Sequence % already exists.', _fullname;
ELSE
RAISE EXCEPTION
'Sequence % already exists but you have no USAGE privilege.'
, _fullname;
END IF;
ELSE
RAISE EXCEPTION 'A(n) "%" named % already exists.'
-- Table-like objects in pg 9.4:
-- www.postgresql.org/docs/current/static/catalog-pg-class.html
, CASE _relkind WHEN 'r' THEN 'ordinary table'
WHEN 'i' THEN 'index'
-- WHEN 'S' THEN 'sequence' -- impossible here
WHEN 'v' THEN 'view'
WHEN 'm' THEN 'materialized view'
WHEN 'c' THEN 'composite type'
WHEN 't' THEN 'TOAST table'
WHEN 'f' THEN 'foreign table'
ELSE 'unknown object' END
, _fullname;
END IF;
END
$func$ LANGUAGE plpgsql;
COMMENT ON FUNCTION f_create_seq(text, text) IS
'Create sequence if name is free.
RAISE NOTICE on successful creation.
RAISE WARNING if it already exists.
RAISE EXCEPTION if it already exists and current user lacks USAGE privilege.
RAISE EXCEPTION if object of a different kind occupies the name.
$1 _seq .. sequence name
$2 _schema .. schema name (optional; default is CURRENT_SCHEMA)';
電話:
SELECT f_create_seq('myseq', 'myschema');
または:
SELECT f_create_seq('myseq1'); -- defaults to current schema
説明
コードの最後にある関数へのコメントも読んでください。
Postgres9.1以降で動作します。古いバージョンの場合は、置き換える必要があるだけですformat()
。これは、SQLインジェクションを防ぎます。詳細:
2つの別個のパラメーターにより、現在のスキーマに依存しない任意のスキーマのシーケンスが可能になり、そのジョブを実行することsearch_path
もできます。スキーマ修飾名で失敗する-あいまいになります。quote_ident()
quote_ident()
スキーマパラメータにはデフォルト値があるため、呼び出しから省略できます。スキーマが指定されていない場合、関数はデフォルトで。になりcurrent_schema
ます。ドキュメントごと:
current_schema
検索パスの最初にあるスキーマの名前を返します(検索パスが空の場合はnull値)。これは、ターゲットスキーマを指定せずに作成されたテーブルまたはその他の名前付きオブジェクトに使用されるスキーマです。
pgclass.relkind
マニュアルのタイプのリスト。
PostgreSQLエラーコード。