CREATE TABLE ステートメントに次の行があります。
field1_id bigint DEFAULT nextval('table1_field1_id_seq'::regclass) NOT NULL,
上記の regclass とはどういう意味ですか? を追加することは絶対要件::regclass
ですか?
注意:について説明している Postgresql ドキュメントリンクregclass
を見たことがありますが、理解できませんでした。
CREATE TABLE ステートメントに次の行があります。
field1_id bigint DEFAULT nextval('table1_field1_id_seq'::regclass) NOT NULL,
上記の regclass とはどういう意味ですか? を追加することは絶対要件::regclass
ですか?
注意:について説明している Postgresql ドキュメントリンクregclass
を見たことがありますが、理解できませんでした。
いいえ、 toからの暗黙のキャストがあるため、パラメーターを受け入れるregclass
ような関数を呼び出すときにto へのキャストは必要ありません。他のコンテキストでは、への明示的なキャストが必要になる場合があります。nextval
regclass
text
regclass
regclass
説明:
::regclass
のようなキャストです::integer
。
regclass
「魔法の」データ型です。実際にはoid
、または「オブジェクト識別子」のエイリアスです。ドキュメントのオブジェクト識別子の型を参照してください。へのキャストregclass
は、「これはリレーションの名前です。そのリレーションの oid に変換してください」と言うショートカットです。リレーションを直接クエリするのとは異なり、 へのキャストregclass
は を認識します。search_path
pg_class
oid
pg_class
テーブルはリレーションです。シーケンスとビューも同様です。したがって、regclass にもキャストすることで、ビューまたはシーケンスの oid を取得できます。
text
toには暗黙のキャストが定義されて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(...)
言い換えると:
pg_class
し、それぞれを名前空間 (スキーマ) に関連付けます。search_path
ドキュメントについて私が理解していることから、oidはタイプに細分されています。regclass
リレーションを表すデータベース オブジェクトです (メタデータ テーブル pg_class に属します)。
これは、シーケンスとDEFAULT
式の間の依存関係を表します (たとえば、INSERT クエリで明示的な値が指定されていない場合にデフォルト値を生成するプロセスを意味します)。したがってDROP SEQUENCE ...
、シーケンスで a を発行すると、クエリはパスしません。カスケードされていない限り(書き込みによってDROP SEQUENCE table1_field1_id_seq CASCADE
)。