Over NULL
'anything' NOT LIKE NULL
geeft NULL
, niet TRUE
.
En alleen TRUE
komt in aanmerking voor filterexpressies in een WHERE
clausule.
De meeste functies retourneren NULL
op NULL
invoer (er zijn uitzonderingen). Dat is de aard van NULL
in elke juiste RDBMS.
Als je een single wilt hebben uitdrukking, je zou gebruik:
AND (column_default LIKE 'nextval%') IS NOT TRUE;
Dat is echter nauwelijks korter of sneller. Details in de handleiding.
Juiste zoekopdracht
Je vraag is nog steeds onbetrouwbaar. Een tabelnaam alleen is niet uniek in een Postgres-database, u moet daarnaast de schemanaam opgeven of vertrouwen op het huidige search_path
om de eerste overeenkomst erin te vinden:
Gerelateerd:
- Hoe beïnvloedt het zoekpad de resolutie van de ID en het "huidige schema"
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%');
Beter, maar nog steeds niet kogelvrij. Een standaardkolom die begint met 'nextval' maakt geen serial
, nog. Zie:
- Tabelkolom automatisch verhogen
Controleer voor de zekerheid of de gebruikte reeks "eigendom" is van de kolom met pg_get_serial_sequence(table_name, column_name)
.
Zelf gebruik ik het informatieschema zelden. Die trage, opgeblazen weergaven garanderen overdraagbaarheid tussen belangrijke versies - en zijn gericht op overdraagbaarheid naar andere standaard-compatibele RDBMS. Maar te veel is sowieso onverenigbaar. Oracle implementeert niet eens het informatieschema (vanaf 2015).
Ook ontbreken er bruikbare Postgres-specifieke kolommen in het informatieschema. In dit geval zou ik de systeemcatalogi als volgt kunnen doorzoeken:
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) <> ''
);
Sneller en betrouwbaarder, maar minder draagbaar.
De handleiding:
De catalogus pg_attrdef
slaat standaardwaarden voor kolommen op. De belangrijkste informatie over kolommen wordt opgeslagen in pg_attribute
(zie onder). Alleen kolommen die expliciet een standaardwaarde specificeren (wanneer de tabel wordt gemaakt of de kolom wordt toegevoegd) hebben hier een vermelding.
'table1'::regclass
gebruikt het search_path
om de naam op te lossen, wat dubbelzinnigheid vermijdt. U kunt de naam schema-kwalificeren om te overschrijven:'myschema.table1'::regclass
.
Gerelateerd:
- Zoek de tabelnaam waarnaar wordt verwezen met behulp van tabel-, veld- en schemanaam
- De standaardwaarden van tabelkolommen in Postgres ophalen?