仅使用默认NOW()为新行添加时间戳列


112

我有一个具有数千行的表。由于表最初不是使用created_at列构建的,因此无法获取其创建时间戳。不过,开始获取未来行的时间戳至关重要。

有没有一种方法可以添加带有默认值NOW()的时间戳记列,以便它不会将值填充到先前的行中,而只会填充将来的行?

如果我执行ALTER查询,它将使用时间戳填充所有行:

ALTER TABLE mytable ADD COLUMN created_at TIMESTAMP DEFAULT NOW()

Answers:


159

您需要添加默认值null的列,然后将其更改为默认值now()

ALTER TABLE mytable ADD COLUMN created_at TIMESTAMP;
ALTER TABLE mytable ALTER COLUMN created_at SET DEFAULT now();

43

您可以在alter表中添加默认规则,

ALTER TABLE mytable ADD COLUMN created_at TIMESTAMP DEFAULT NOW()

然后立即将所有当前现有行设置为null:

UPDATE mytable SET created_at = NULL

然后从这一点DEFAULT开始生效。


原则上讲这很好,尽管它确实承担了可能触发触发器的更新工作。
菲利普·库林

8
@Artur:Philip提出的解决方案是必经之路。UPDATE没有必要。如果将列默认值添加到现有列,则现有行不会受到影响。仅当您在同一命令中添加列和默认值时,才填写默认值。
Erwin Brandstetter


0

尝试类似:

ALTER TABLE table_name ADD  CONSTRAINT [DF_table_name_Created] 
DEFAULT (getdate()) FOR [created_at];

替换table_name为表格名称。


1
这样的CONTSTRAINT有什么好处?
rubo77
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.