Tentang NULL
'anything' NOT LIKE NULL
menghasilkan NULL
, bukan TRUE
.
Dan hanya TRUE
memenuhi syarat untuk ekspresi filter dalam WHERE
klausa.
Sebagian besar fungsi mengembalikan NULL
pada NULL
masukan (ada pengecualian). Itulah sifat dari NULL
di apa saja RDBMS yang tepat.
Jika Anda menginginkan tunggal ekspresi, Anda bisa gunakan:
AND (column_default LIKE 'nextval%') IS NOT TRUE;
Itu hampir tidak lebih pendek atau lebih cepat. Detail dalam manual.
Kueri yang tepat
Permintaan Anda masih tidak dapat diandalkan. Nama tabel saja tidak unik dalam database Postgres, Anda perlu menentukan nama skema sebagai tambahan atau mengandalkan search_path
saat ini untuk menemukan kecocokan pertama di dalamnya:
Terkait:
- Bagaimana search_path mempengaruhi resolusi pengenal dan "skema saat ini"
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%');
Lebih baik, tapi tetap tidak anti peluru. Default kolom yang dimulai dengan 'nextval' tidak membuat serial
, belum. Lihat:
- Kolom tabel kenaikan otomatis
Untuk memastikannya, periksa apakah urutan yang digunakan "dimiliki" oleh kolom dengan pg_get_serial_sequence(table_name, column_name)
.
Saya sendiri jarang menggunakan skema informasi. Tampilan yang lambat dan membengkak itu menjamin portabilitas di seluruh versi utama - dan bertujuan untuk portabilitas ke RDBMS yang sesuai standar lainnya. Tapi terlalu banyak juga tidak cocok. Oracle bahkan tidak mengimplementasikan skema informasi (per 2015).
Juga, kolom khusus Postgres yang berguna tidak ada dalam skema informasi. Untuk kasus ini saya mungkin menanyakan katalog sistem seperti ini:
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) <> ''
);
Lebih cepat dan lebih andal, tetapi kurang portabel.
Panduan:
Katalog
pg_attrdef
menyimpan nilai default kolom. Informasi utama tentang kolom disimpan dipg_attribute
(Lihat di bawah). Hanya kolom yang secara eksplisit menentukan nilai default (ketika tabel dibuat atau kolom ditambahkan) yang akan memiliki entri di sini.
'table1'::regclass
menggunakan search_path
untuk menyelesaikan nama, yang menghindari ambiguitas. Anda dapat memenuhi syarat skema nama untuk mengesampingkan:'myschema.table1'::regclass
.
Terkait:
- Temukan nama tabel yang dirujuk menggunakan tabel, bidang, dan nama skema
- Dapatkan nilai default kolom tabel di Postgres?