SELECT column_name FROM information_schema.columns WHERE table_name = 'table1' AND column_default NOT LIKE 'nextval%'
但问题是它还排除/过滤具有column_default空值的行.我不知道为什么Postgres的行为是这样的.所以我不得不将我的查询更改为以下内容:
SELECT column_name FROM information_schema.columns WHERE table_name = 'table1' AND ( column_default IS NULL OR column_default NOT LIKE 'nextval%')
欢迎提出任何更好的建议或理由.
解决方法
‘nothing’NOT LIKE NULL产生NULL,而不是TRUE.
并且只有TRUE符合WHERE子句中的过滤器表达式.
大多数函数在NULL输入时返回NULL(有例外).这是任何适当的RDBMS中NULL的本质.
如果您需要单个表达式,可以使用:
AND (column_default LIKE 'nextval%') IS NOT TRUE;
然而,这几乎不会更短或更快. Details in the manual.
正确的查询
您的查询仍然不可靠.在Postgres数据库中,单独的表名不是唯一的,您需要另外指定模式名称,或者依赖当前的search_path来查找其中的第一个匹配项:
有关:
> How does the search_path influence identifier resolution and the “current 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%');
更好,但仍然没有防弹.以’nextval’开头的列默认值不会生成序列号.看到:
为了确保,检查使用的序列是否由具有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 catalog
pg_attrdef
stores column default values. The main
information about columns is stored inpg_attribute
(see below). Only
columns that explicitly specify a default value (when the table is
created or the column is added) will have an entry here.
‘table1′:: regclass使用search_path来解析名称,这避免了歧义.您可以对名称进行模式限定以取代:’myschema.table1’:: regclass.
有关:
> Find the referenced table name using table,field and schema name
> Get the default values of table columns in Postgres?