将列的值设置为其默认值。

7

我有几个现有的表格,需要修改其中的各个列以设定默认值。

我该如何将默认值应用于旧记录中的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个回答

11

来源于insert into

For clarity, you can also request default values explicitly, for individual columns or for the entire row:

INSERT INTO products (product_no, name, price) VALUES (1, 'Cheese', DEFAULT);
INSERT INTO products DEFAULT VALUES;

我刚试过了,而且它非常简单

update mytable
set my_column = default
where my_column is null

请参考sqlfiddle


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')这样的表达式。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接