2016-08-12 45 views
29

我有一个包含数千行的表。由于该表最初并未使用created_at列构建,因此无法获取其创建时间戳。尽管开始获取未来行的时间戳是至关重要的。只为新行添加默认为NOW()的时间戳列

有没有一种方法,我可以添加一个默认值NOW()的时间戳列,以便它不会将值填充到以前的行,但只为未来的行?

如果我做ALTER查询,它填充的所有行与时间戳:

ALTER TABLE mytable ADD COLUMN created_at TIMESTAMP DEFAULT NOW() 

回答

9

你可以使用ALTER TABLE添加默认规则,

ALTER TABLE mytable ADD COLUMN created_at TIMESTAMP DEFAULT NOW() 

然后立即设置为null所有当前存在的行:

UPDATE mytable SET created_at = NULL 

然后从这个点上DEFAULT将生效。

+0

它原则上是好的,尽管它确实承担了更新的重要性,它可能触发触发器。 –

+0

是这样做的。 – Artur

+2

@Artur:Philip介绍的解决方案就是要走的路。 'UPDATE'不是必需的。如果将列默认添加到*现有*列,则现有的行不受影响。如果您在同一命令中添加列和默认值,则只填充默认值。 –

0

试着这么做

ALTER TABLE表名ADD CONSTRAINT [DF_table_name_Created] DEFAULT(GETDATE())在[created_at]

与您的表的名称替换table_name的

48

您需要添加列,默认为null,然后更改列以​​使其具有默认值now()

ALTER TABLE mytable ADD COLUMN created_at TIMESTAMP; 
ALTER TABLE mytable ALTER COLUMN created_at SET DEFAULT now(); 
相关问题