About NULL
'anything' NOT LIKE NULL
产生NULL
,而不是TRUE
大多数函数返回NULL
对NULL
输入(也有例外).这就是any个RDBMS中NULL
个的本质.
如果你想要single的表达,你可以使用:
AND (column_default LIKE 'nextval%') IS NOT TRUE;
但这并不是更短或更快.Details in the manual.
正确的询问
你的查询仍然不可靠.表名在Postgres数据库中不是唯一的,您需要另外指定模式名,或者依赖当前的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) <> ''
);
更快、更可靠,但便携性较差.
The manual:
目录pg_attrdef
存储列默认值.主要
'table1'::regclass
使用search_path
来解析名称,这避免了歧义.您可以限定名称以否决:'myschema.table1'::regclass
.
相关的: