仅为新行添加带有默认NOW()的timestamp列

Art*_*tur 89 postgresql

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

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

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

ALTER TABLE mytable ADD COLUMN created_at TIMESTAMP DEFAULT NOW()
Run Code Online (Sandbox Code Playgroud)

Phi*_*ing 129

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

ALTER TABLE mytable ADD COLUMN created_at TIMESTAMP;
ALTER TABLE mytable ALTER COLUMN created_at SET DEFAULT now();
Run Code Online (Sandbox Code Playgroud)


Ren*_*nzo 34

您可以使用alter table添加默认规则,

ALTER TABLE mytable ADD COLUMN created_at TIMESTAMP DEFAULT NOW()
Run Code Online (Sandbox Code Playgroud)

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

UPDATE mytable SET created_at = NULL
Run Code Online (Sandbox Code Playgroud)

然后从这一点开始DEFAULT就会生效.

  • @Artur:菲利普提出的解决方案是要走的路."UPDATE"不是必需的.如果将列默认值添加到*existing*列,则现有行不受影响.如果在同一命令中添加column和default,则仅填写默认值. (6认同)
  • 原则上它是好的,尽管它确实承担了进行“可能”触发的更新的重量。 (3认同)

小智 15

例如,我将创建一个users如下所示的表,并给出一个名为date默认值的列NOW()

create table users_parent (
    user_id     varchar(50),
    full_name   varchar(240),
    login_id_1  varchar(50),
    date        timestamp NOT NULL DEFAULT NOW()
);
Run Code Online (Sandbox Code Playgroud)

谢谢

  • 这根本没有回答原来的问题。问题是关于_更改_现有表,**不是**创建新表。 (2认同)