将列的值设置为其默认值

时间:2016-10-15 07:06:15

标签: postgresql information-schema

我现有几个表,我必须修改各个列才能拥有默认值。

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

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

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

    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)

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

2 个答案:

答案 0 :(得分:4)

我刚试过这个,就像

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

请参阅sqlfiddle

答案 1 :(得分:0)

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

对于每列,可以很容易地使用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')这样的表达式

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