O NULL
'anything' NOT LIKE NULL
dává NULL
, nikoli TRUE
.
A pouze TRUE
splňuje podmínky pro výrazy filtru v WHERE
doložka.
Většina funkcí vrací NULL
na NULL
vstup (existují výjimky). To je povaha NULL
v jakémkoli správné RDBMS.
Pokud si přejete single výraz, mohli byste použití:
AND (column_default LIKE 'nextval%') IS NOT TRUE;
To však není kratší nebo rychlejší. Podrobnosti v návodu.
Správný dotaz
Váš dotaz je stále nedůvěryhodný. Samotný název tabulky není v databázi Postgres jedinečný, musíte navíc zadat název schématu nebo se spolehnout na aktuální search_path
najít v něm první shodu:
Související:
- Jak parametr search_path ovlivňuje rozlišení identifikátoru a "aktuální schéma"
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%');
Lepší, ale stále ne neprůstřelné. Výchozí sloupec začínající 'nextval' nevytváří serial
, dosud. Viz:
- Automaticky zvyšovat sloupec tabulky
Pro jistotu zkontrolujte, zda je používaná sekvence „vlastněna“ sloupcem s pg_get_serial_sequence(table_name, column_name)
.
Sám informační schéma používám jen zřídka. Tyto pomalé, nafouklé pohledy zaručují přenositelnost mezi hlavními verzemi – a zaměřují se na přenositelnost na jiné standardy vyhovující RDBMS. Ale příliš mnoho je stejně neslučitelné. Oracle ani neimplementuje informační schéma (od roku 2015).
V informačním schématu také chybí užitečné sloupce specifické pro Postgres. V tomto případě bych se mohl dotazovat na systémové katalogy takto:
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) <> ''
);
Rychlejší a spolehlivější, ale méně přenosné.
Manuál:
Katalog
pg_attrdef
ukládá výchozí hodnoty sloupců. Hlavní informace o sloupcích jsou uloženy vpg_attribute
(viz. níže). Zde budou mít položku pouze sloupce, které explicitně specifikují výchozí hodnotu (při vytvoření tabulky nebo přidání sloupce).
'table1'::regclass
používá search_path
k vyřešení názvu, čímž se zabrání dvojznačnosti. Název, který chcete přepsat, můžete kvalifikovat podle schématu:'myschema.table1'::regclass
.
Související:
- Najděte název odkazované tabulky pomocí názvu tabulky, pole a schématu
- Získat výchozí hodnoty sloupců tabulky v Postgresu?