NULL
について
'anything' NOT LIKE NULL
NULL
を生成します 、TRUE
ではありません 。
そしてTRUE
のみ WHERE
のフィルター式の対象 条項。
ほとんどの関数はNULL
を返します NULL
で 入力(例外があります)。それがNULL
の性質です 任意 適切なRDBMS。
シングルが必要な場合 表現、あなたはできた 使用:
AND (column_default LIKE 'nextval%') IS NOT TRUE;
しかし、それはほとんど短くも速くもありません。マニュアルの詳細。
適切なクエリ
あなたの質問はまだ信頼できません。 Postgresデータベースでは、テーブル名だけでは一意ではありません。さらにスキーマ名を指定するか、現在のsearch_path
に依存する必要があります。 その中の最初の一致を見つけるには:
関連:
- search_pathは識別子の解決と「現在のスキーマ」にどのように影響しますか
SELECT column_name
FROM information_schema.columns
WHERE table_name = 'hstore1'
AND table_schema = 'public' -- your schema
AND (column_default IS NULL OR
column_default NOT LIKE 'nextval%');
より良いですが、それでも防弾ではありません。 'nextval'で始まる列のデフォルトは、serial
を作成しません 、 まだ。参照:
- テーブル列の自動インクリメント
確かに、使用中のシーケンスがpg_get_serial_sequence(table_name, column_name)
の列によって「所有」されているかどうかを確認してください。 。
自分で情報スキーマを使うことはめったにありません。これらの遅く肥大化したビューは、メジャーバージョン間での移植性を保証し、他の標準準拠のRDBMSへの移植性を目指しています。しかし、多すぎるととにかく互換性がありません。オラクルは情報スキーマさえ実装していません(2015年現在)。
また、有用なPostgres固有の列が情報スキーマにありません。この場合、次のようにシステムカタログを照会できます。
SELECT *
FROM pg_catalog.pg_attribute a
WHERE attrelid = 'table1'::regclass
AND NOT attisdropped -- no dropped (dead) columns
AND attnum > 0 -- no system columns
AND NOT EXISTS (
SELECT FROM pg_catalog.pg_attrdef d
WHERE (d.adrelid, d.adnum) = (a.attrelid, a.attnum)
AND d.adsrc LIKE 'nextval%'
AND pg_get_serial_sequence(a.attrelid::regclass::text, a.attname) <> ''
);
より速く、より信頼性がありますが、移植性は低くなります。
マニュアル:
カタログ
pg_attrdef
列のデフォルト値を格納します。列に関する主な情報は、pg_attribute
に保存されます (下記参照)。デフォルト値を明示的に指定する列(テーブルが作成されるとき、または列が追加されるとき)のみがここにエントリを持ちます。
'table1'::regclass
search_path
を使用します 名前を解決し、あいまいさを回避します。名前をスキーマ修飾して無効にすることができます:'myschema.table1'::regclass
。
関連:
- テーブル、フィールド、スキーマ名を使用して、参照されているテーブル名を検索します
- Postgresのテーブル列のデフォルト値を取得しますか?