驚いたことに、このクエリの_is_nullable
_列がboolean
ではなくcharacter varying (3)
として入力されていることがわかりました。
_select
column_name,
data_type,
is_nullable
from
information_schema.columns
where
table_schema = 'public';
_
他の列でも「はい」/「いいえ」を使用していることに気づきました。これの理由は何ですか?私の当初の考えでは、「[はい]」と「[いいえ]」以外の値も可能であり、boolean
以外の値を正当化できると思いましたが、現在のデータベースではこれの例を確認できませんでした。
INFORMATION_SCHEMA
Psqlを使用すると、\d information_schema.columns
を使用してスキーマを表示できます。または、 ドキュメントで検索 を使用してスキーマを表示できます。
View "information_schema.columns"
Column | Type | Collation | Nullable | Default
--------------------------+------------------------------------+-----------+----------+---------
... stuff cropped..
is_nullable | information_schema.yes_or_no | | |
仕様でinformation_schema.columns.is_nullable
を検索すると、仕様の誤りであることがわかります。 9,000年分の遺産を消すことはできません。特に、信頼できるインターフェースを提供することになっているもので。 SQL 2011仕様から、
IS_NULLABLE INFORMATION_SCHEMA.YES_OR_NO
CONSTRAINT COLUMNS_IS_NULLABLE_NOT_NULL NOT NULL,
仕様で定義されているINFORMATION_SCHEMA.YES_OR_NO
の定義も確認できます。
CREATE DOMAIN YES_OR_NO AS
CHARACTER VARYING (3)
CHARACTER SET SQL_IDENTIFIER
CONSTRAINT YES_OR_NO_CHECK
CHECK (VALUE IN ( 'YES', 'NO' ) );
GRANT USAGE ON DOMAIN YES_OR_NO
TO PUBLIC WITH GRANT OPTION;
ただし、汎用の標準化されたインターフェイスが必要ない場合は、通常、 pg_catalog
でより健全なものを見つけることができます。この場合、必要なのは pg_catalog.pg_attribute
です。 \d pg_catalog.pg_attribute
をチェックしてみましょう。
Table "pg_catalog.pg_attribute"
Column | Type | Collation | Nullable | Default
---------------+-----------+-----------+----------+---------
attnotnull | boolean | | not null |
あなたのブールがあります。
情報スキーマに関するPostgreSQLのドキュメント:データ型 実際にこれにも対処します、
[〜#〜] yes [〜#〜]または[〜#〜のいずれかを含む文字列ドメイン]いいえ[〜#〜]。これは、情報スキーマでブール(true/false)データを表すために使用されます。 (タイプ
boolean
がSQL標準に追加される前に情報スキーマが発明されたため、情報スキーマの下位互換性を維持するためにこの規約が必要です。)