CREATE TABLEステートメントに次の行があります。
field1_id bigint DEFAULT nextval('table1_field1_id_seq'::regclass) NOT NULL,
上記でregclassは何を意味しますか? ::regclass
を追加することは絶対要件ですか?
NB:Postgresqlのドキュメントを見ました linkregclass
について説明していますが、理解できませんでした。
いいえ、regclass
から暗黙的なキャストがあるため、nextval
パラメーターを受け入れるregclass
などの関数を呼び出す場合、text
へのキャストは必要ありません。 regclass
に。他のコンテキストでは、regclass
への明示的なキャストが必要な場合があります。
説明:
::regclass
は、::integer
のようなキャストです。
regclass
は「マジック」データ型です。実際にはoid
のエイリアス、または「オブジェクト識別子」です。ドキュメントの Object identifier types を参照してください。 regclass
へのキャストは、「これはリレーションの名前です。そのリレーションのOIDに変換してください」と言う簡単な方法です。リレーションのregclass
を直接照会するsearch_path
とは異なり、oid
へのキャストはpg_class
を認識しているため、regclassへのキャストはpg_class
のサブクエリとまったく同じではありません。
テーブルは関係です。シーケンスとビューも同様です。したがって、regclassにキャストすることで、ビューまたはシーケンスのoidを取得できます。
text
からregclass
への暗黙的なキャストが定義されているため、明示的なキャストを省略し、regclass
を受け入れる関数を呼び出す場合、キャストは自動的に行われます。したがって、たとえばnextval
呼び出しでnotは必要ありません。
他の場所もあります。たとえば、text
とoid
を直接比較することはできません。あなたはこれを行うことができます:
regress=> select * from pg_class where oid = 'table1'::regclass;
しかしこれではありません:
regress=> select * from pg_class where oid = 'table1';
ERROR: invalid input syntax for type oid: "table1"
LINE 1: select * from pg_class where oid = 'table1';
ただの楽しみのために、regclass
へのキャストと同等の操作を実行するクエリを作成しようとしました。それを使用しないでください、それは主に楽しみのためであり、実際に起こっていることをデモする試みとしてです。 Pgのガッツがどのように機能するかに本当に興味がない限り、ここで読むのをやめることができます。
私の理解では、'sequence_name'::regclass::oid
は次のクエリとほぼ同等です。
WITH sp(sp_ord, sp_schema) AS (
SELECT
generate_series(1, array_length(current_schemas('t'),1)),
unnest(current_schemas('t'))
)
SELECT c.oid
FROM pg_class c INNER JOIN pg_namespace n ON (c.relnamespace = n.oid)
INNER JOIN sp ON (n.nspname = sp.sp_schema)
WHERE c.relname = 'sequence_name'
ORDER BY sp.sp_ord
LIMIT 1;
ただし、はるかに短く、はるかに高速です。 current_schemas(...)
などの定義については、 システム情報関数 を参照してください。
言い換えると:
pg_class
で一致する名前の関係を検索し、それぞれをその名前空間(スキーマ)に関連付けますsearch_path
に表示されるスキーマの順序で残りの関係のリストをソートします私がドキュメントについて理解していることから、oidはタイプに細分化されています。 regclass
は、リレーションを表すデータベースオブジェクトです(したがって、メタデータテーブルpg_classに属します)。
シーケンスとDEFAULT
式の間の依存関係を表します(たとえば、INSERTクエリで明示的な値が指定されていない場合、デフォルト値を生成するプロセスを意味します)。したがって、DROP SEQUENCE ...
シーケンス上では、(DROP SEQUENCE table1_field1_id_seq CASCADE
と記述することにより)カスケードされない限り、クエリは渡されません。