我想获取表中除serial类型的列之外的所有列.与这个问题最接近的问题是,我提出了这个问题:

SELECT column_name FROM information_schema.columns
WHERE table_name = 'table1' AND column_default NOT LIKE 'nextval%'

但问题是,它也会排除/过滤列默认值为空的行.我不知道为什么博士后的行为是这样的.所以我不得不把我的问题改成这样:

SELECT column_name FROM information_schema.columns
WHERE table_name = 'table1'
AND ( column_default IS NULL OR column_default NOT LIKE 'nextval%')

欢迎提出任何更好的建议或理由.

推荐答案

About NULL

'anything' NOT LIKE NULL产生NULL,而不是TRUE

大多数函数返回NULLNULL输入(也有例外).这就是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.

相关的:

Postgresql相关问答推荐

在输入稍有错误的PostgreSQL表中进行快速字符串搜索

Postgresql我必须创建一个索引还是已经有一个索引了?

为什么在使用PostGIS时,英国郡的几何图形会出现在几内亚湾?

使函数内部动态插入更具可读性

PostgreSQL无效语法

如何获得一起满足数量要求的物品? (WHILE 循环还是 CTE?)postgresql

使用 pgAdmin 4 v7.4 在 Windows 11 上全新安装 PostgreSQL 15.3-3 无法启动 - 卡在正在加载 pgAdmin 4 v7.4...

将数组的所有元素循环到jsonb中并修改值

计算每行的多列中的非 NULL 元素

从 Postgres 字段中的多个值中进行 Select

PostgreSQL ORDER BY 问题 - 自然排序

带有双引号的 postgresql COPY 和 CSV 数据

为什么 SQLAlchemy 不创建串行列?

如何将1 天 01:30:00等间隔转换为25:30:00?

丢弃顺序和级联

Postgres 类似于 SQL Server 中的 CROSS APPLY

如何将主键添加到视图?

如何增加 max_locks_per_transaction

如果 PostgreSQL count(*) 总是很慢,如何对复杂查询进行分页?

错误:无法在只读事务中执行 CREATE TABLE