Относно 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. Но твърде много е несъвместимо така или иначе. Oracle дори не прилага информационната схема (от 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?