Adicionar coluna de carimbo de data / hora com o padrão NOW () apenas para novas linhas

111

Tenho uma tabela com milhares de linhas. Como a tabela não foi construída inicialmente com a coluna created_at, não há como obter o carimbo de data / hora de criação. No entanto, é crucial começar a obter os carimbos de data / hora para linhas futuras.

Existe uma maneira de adicionar uma coluna de carimbo de data / hora com o valor padrão NOW () para que ela não preencha os valores nas linhas anteriores, mas apenas nas futuras?

Se eu fizer a ALTERconsulta, ela preencherá todas as linhas com carimbo de data / hora:

ALTER TABLE mytable ADD COLUMN created_at TIMESTAMP DEFAULT NOW()
Artur
fonte

Respostas:

157

Você precisa adicionar a coluna com um padrão de e null, em seguida, alterar a coluna para ter o padrão now().

ALTER TABLE mytable ADD COLUMN created_at TIMESTAMP;
ALTER TABLE mytable ALTER COLUMN created_at SET DEFAULT now();
Philip Couling
fonte
43

Você pode adicionar a regra padrão com a tabela de alteração,

ALTER TABLE mytable ADD COLUMN created_at TIMESTAMP DEFAULT NOW()

em seguida, defina imediatamente como null todas as linhas atuais existentes:

UPDATE mytable SET created_at = NULL

A partir deste ponto, o DEFAULTterá efeito.

Renzo
fonte
É bom em princípio, embora tenha o peso de fazer uma atualização que pode disparar gatilhos.
Philip Couling
7
@Artur: A solução apresentada por Philip é o caminho a seguir. UPDATEnão é necessário. Se você adicionar um padrão de coluna a uma coluna existente , as linhas já existentes não serão afetadas. O padrão só é preenchido se você adicionar coluna e padrão no mesmo comando.
Erwin Brandstetter
9

Por exemplo, vou criar uma tabela chamada userscomo abaixo e dar a uma coluna chamada dateum valor padrãoNOW()

create table users_parent (
    user_id     varchar(50),
    full_name   varchar(240),
    login_id_1  varchar(50),
    date        timestamp NOT NULL DEFAULT NOW()
);

obrigado

Mustafa Ahmad Fathy
fonte
0

Experimente algo como: -

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

substituindo table_namepelo nome de sua mesa.

Michael Gungaram-Smith
fonte
qual é o benefício de tal CONTSTRAINT?
rubo77