【发布时间】:2021-05-17 16:41:57
【问题描述】:
我有一个 PostgreSQL 表,其中包含未在插入查询中指定的列的默认值。 如果当前值等于 DEFAULT,我如何运行查询来更新列值?
在 MySQL 中,我有
UPDATE t SET foo = 'foo' WHERE foo = DEFAULT(foo);
但它在 PosgtreSQL 中不起作用。
【问题讨论】:
标签: postgresql sql-update
我有一个 PostgreSQL 表,其中包含未在插入查询中指定的列的默认值。 如果当前值等于 DEFAULT,我如何运行查询来更新列值?
在 MySQL 中,我有
UPDATE t SET foo = 'foo' WHERE foo = DEFAULT(foo);
但它在 PosgtreSQL 中不起作用。
【问题讨论】:
标签: postgresql sql-update
您可以从information_schema.columns 的column_default 列中获取列的默认值。
对于定义为VARCHAR 或CHAR 的列,此值分别返回为'somevalue'::character varying 或'somevalue'::bpchar,因此您必须在:: 之前取部分并修剪单引号:
UPDATE t
SET foo = 'new value'
WHERE foo = (
SELECT TRIM('''' FROM SPLIT_PART(column_default, '::', 1))
FROM information_schema.columns
WHERE table_name = 't' AND column_name = 'foo'
)
查看简化的demo。
【讨论】:
在 PostgreSQL 中没有办法做到这一点,我根本无法想象这样的功能是如何工作的。
假设列被定义为
foo timestamp DEFAULT localtimestamp
如何判断插入的时间戳是否恰好是默认值?
【讨论】: