52

CREATE TABLE ステートメントに次の行があります。

field1_id bigint DEFAULT nextval('table1_field1_id_seq'::regclass) NOT NULL,

上記の regclass とはどういう意味ですか? を追加することは絶対要件::regclassですか?

注意:について説明している Postgresql ドキュメントリンクregclassを見たことがありますが、理解できませんでした。

4

2 に答える 2

76

いいえ、 toからの暗黙のキャストがあるため、パラメーターを受け入れるregclassような関数を呼び出すときにto へのキャストは必要ありません。他のコンテキストでは、への明示的なキャストが必要になる場合があります。nextvalregclasstextregclassregclass

説明:

::regclassのようなキャストです::integer

regclass「魔法の」データ型です。実際にはoid、または「オブジェクト識別子」のエイリアスです。ドキュメントのオブジェクト識別子の型を参照してください。へのキャストregclassは、「これはリレーションの名前です。そのリレーションの oid に変換してください」と言うショートカットです。リレーションを直接クエリするのとは異なり、 へのキャストregclassは を認識します。search_pathpg_classoidpg_class

テーブルはリレーションです。シーケンスとビューも同様です。したがって、regclass にもキャストすることで、ビューまたはシーケンスの oid を取得できます。

texttoには暗黙のキャストが定義されてregclassいるため、明示的なキャストを省略してキャストを受け入れる関数を呼び出している場合regclass、キャストは自動的に行われます。したがって、たとえば通話では必要ありません。nextval

あなたができる他の場所があります。たとえば、 ;と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(...)

言い換えると:

  • アクセスできるすべてのスキーマをリストする ab 配列を取得し、各エントリを配列内の位置の序数とペアにします
  • 名前が一致するリレーションを検索pg_classし、それぞれを名前空間 (スキーマ) に関連付けます。
  • 残りの関係のリストを、それらのスキーマが表示された順序で並べ替えますsearch_path
  • そして最初のマッチを選ぶ
于 2012-11-08T13:38:07.213 に答える
0

ドキュメントについて私が理解していることから、oidはタイプに細分されています。regclassリレーションを表すデータベース オブジェクトです (メタデータ テーブル pg_class に属します)。

これは、シーケンスとDEFAULT式の間の依存関係を表します (たとえば、INSERT クエリで明示的な値が指定されていない場合にデフォルト値を生成するプロセスを意味します)。したがってDROP SEQUENCE ...、シーケンスで a を発行すると、クエリはパスしません。カスケードされていない限り(書き込みによってDROP SEQUENCE table1_field1_id_seq CASCADE)。

于 2012-11-08T12:37:33.627 に答える