PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Zachowanie NOT LIKE z wartościami NULL

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?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zaktualizować bazę danych postgresql z 10 do 12 bez utraty danych dla openproject?

  2. Instalacja PostgreSQL w Dockerze

  3. Ograniczenie NOT NULL na zbiorze kolumn

  4. Jak stworzyć proste wyszukiwanie rozmyte tylko za pomocą PostgreSQL?

  5. ver.2 BŁĄD PyGreSQL:from _pg import * ImportError:Ładowanie DLL nie powiodło się:Nie można znaleźć określonego modułu