将列的值设置为其默认值

Set the value of a column to its default value

我现有的 table 很少,我必须在其中修改各个列以获得默认值。

如何将默认值应用于 NULL 的旧记录,以便旧记录与新记录保持一致

ALTER TABLE "mytable" ALTER COLUMN "my_column" SET DEFAULT NOW();

修改后 table 看起来像这样...

    Table "public.mytable"
 Column      |            Type             |                        Modifiers
-------------+-----------------------------+-----------------------------------------------
 id          | integer                     | not null default nextval('mytable_id_seq'::regclass)
 ....

 my_column   | timestamp(0) with time zone | default now()

Indexes:
  "mytable_pkey" PRIMARY KEY, btree (id)

是否有一种简单的方法可以将所有当前为空且具有默认值的列设置为默认值?

编辑: 答案是最简单和正确的方法,但是对于大多数情况,以下也是可行的解决方案。

对于每一列,很容易使用 information_schema 并获取列的默认值,然后在 UPDATE 语句中使用它

UPDATE mytable set my_column = (
  SELECT column_default
  FROM information_schema.columns
  WHERE (table_schema, table_name, column_name) = ('public', 'mytable','my_column')
)::timestamp
WHERE my_column IS NULL;

注意子查询必须通过类型转换为相应的列数据类型。

此外,此语句不会评估表达式,因为 column_default 将属于字符类型,它适用于 NOW() 但不适用于像 (NOW()+ interval ' 7 days')

这样的表达式

最好获取表达式并验证它然后手动应用它

insert into推导出来,我刚刚试了一下,和

一样简单
update mytable
set my_column = default
where my_column is null

sqlfiddle