【问题标题】:Set the value of a column to its default value将列的值设置为其默认值
【发布时间】:2016-10-15 07:06:14
【问题描述】:

我有几个现有的表,我必须在其中修改各个列以具有默认值。

如何将默认值应用于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)

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

【问题讨论】:

    标签: postgresql information-schema


    【解决方案1】:

    源自insert into,我刚试过这个,就这么简单

    update mytable
    set my_column = default
    where my_column is null
    

    sqlfiddle

    【讨论】:

      【解决方案2】:

      编辑: 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') 之类的表达式

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

      【讨论】:

        猜你喜欢
        • 2016-12-28
        • 1970-01-01
        • 2013-03-01
        • 1970-01-01
        • 2016-08-03
        • 1970-01-01
        • 1970-01-01
        • 2019-05-15
        • 1970-01-01
        相关资源
        最近更新 更多