O NULL
'anything' NOT LIKE NULL
daje NULL
, a nie TRUE
.
I tylko TRUE
kwalifikuje się do wyrażeń filtrujących w WHERE
klauzula.
Większość funkcji zwraca NULL
na NULL
wejście (są wyjątki). Taka jest natura NULL
w dowolnym właściwe RDBMS.
Jeśli chcesz singiel wyrażenie, możesz użyj:
AND (column_default LIKE 'nextval%') IS NOT TRUE;
Nie jest to jednak ani krótsze, ani szybsze. Szczegóły w instrukcji.
Właściwe zapytanie
Twoje zapytanie jest nadal niewiarygodne. Sama nazwa tabeli nie jest unikalna w bazie danych Postgres, musisz dodatkowo określić nazwę schematu lub polegać na bieżącej search_path
aby znaleźć w nim pierwsze dopasowanie:
Powiązane:
- W jaki sposób search_path wpływa na rozwiązywanie identyfikatorów i „bieżący schemat”
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%');
Lepiej, ale nadal nie kuloodporny. Domyślna kolumna zaczynająca się od „nextval” nie tworzy serial
, już. Zobacz:
- Automatyczna inkrementacja kolumny tabeli
Dla pewności sprawdź, czy używana sekwencja jest „własnością” kolumny z pg_get_serial_sequence(table_name, column_name)
.
Sam rzadko korzystam ze schematu informacyjnego. Te powolne, rozdęte widoki gwarantują przenośność w głównych wersjach - i mają na celu przenoszenie do innych RDBMS zgodnych ze standardami. Ale i tak zbyt wiele jest nie do pogodzenia. Oracle nie implementuje nawet schematu informacyjnego (stan na 2015 r.).
Ponadto w schemacie informacyjnym brakuje przydatnych kolumn specyficznych dla Postgresa. W tym przypadku mogę zapytać o katalogi systemowe w ten sposób:
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) <> ''
);
Szybszy i bardziej niezawodny, ale mniej przenośny.
Instrukcja:
Katalog pg_attrdef
przechowuje domyślne wartości kolumn. Główne informacje o kolumnach są przechowywane w pg_attribute
(patrz poniżej). Tylko kolumny, które wyraźnie określają wartość domyślną (po utworzeniu tabeli lub dodaniu kolumny) będą miały tutaj wpis.
'table1'::regclass
używa search_path
rozwiązać nazwę, co pozwala uniknąć niejasności. Możesz zakwalifikować według schematu nazwę do zastąpienia:'myschema.table1'::regclass
.
Powiązane:
- Znajdź nazwę tabeli, do której się odwołuje, używając nazwy tabeli, pola i schematu
- Pobrać domyślne wartości kolumn tabeli w Postgresie?