Om NULL
'anything' NOT LIKE NULL
giver NULL
, ikke TRUE
.
Og kun TRUE
kvalificerer til filterudtryk i en WHERE
klausul.
De fleste funktioner returnerer NULL
på NULL
input (der er undtagelser). Det er karakteren af NULL
i enhver korrekt RDBMS.
Hvis du ønsker en enkelt udtryk, du kunne brug:
AND (column_default LIKE 'nextval%') IS NOT TRUE;
Det er dog næppe kortere eller hurtigere. Detaljer i manualen.
Korrekt forespørgsel
Din forespørgsel er stadig upålidelig. Et tabelnavn alene er ikke unikt i en Postgres-database, du skal angive skemanavnet i tillæg eller stole på den aktuelle search_path
for at finde det første match i den:
Relateret:
- Hvordan påvirker søgestien identifikationsopløsning og det "aktuelle skema"
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%');
Bedre, men stadig ikke skudsikker. En kolonnestandard, der starter med 'nextval', laver ikke en serial
, endnu. Se:
- Automatisk stigning i tabelkolonnen
For at være sikker skal du kontrollere, om sekvensen i brug er "ejet" af kolonnen med pg_get_serial_sequence(table_name, column_name)
.
Jeg bruger sjældent informationsskemaet selv. Disse langsomme, oppustede visninger garanterer portabilitet på tværs af større versioner - og sigter mod portabilitet til andre standard-kompatible RDBMS. Men for meget er alligevel uforeneligt. Oracle implementerer ikke engang informationsskemaet (fra 2015).
Desuden mangler nyttige Postgres-specifikke kolonner i informationsskemaet. I dette tilfælde kan jeg forespørge i systemkatalogerne som dette:
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) <> ''
);
Hurtigere og mere pålidelig, men mindre bærbar.
Manualen:
Kataloget pg_attrdef
gemmer kolonnens standardværdier. Hovedoplysningerne om kolonner er gemt i pg_attribute
(se nedenunder). Kun kolonner, der eksplicit angiver en standardværdi (når tabellen oprettes eller kolonnen tilføjes), vil have en indgang her.
'table1'::regclass
bruger search_path
at løse navnet, hvilket undgår tvetydighed. Du kan skemakvalificere navnet til at tilsidesætte:'myschema.table1'::regclass
.
Relateret:
- Find det refererede tabelnavn ved hjælp af tabel-, felt- og skemanavn
- Få standardværdierne for tabelkolonner i Postgres?