Aggiungi la colonna timestamp con il valore predefinito NOW () solo per le nuove righe


111

Ho una tabella che ha migliaia di righe. Poiché la tabella non è stata costruita inizialmente con la colonna created_at, non è possibile ottenere il timestamp di creazione. Tuttavia, è fondamentale iniziare a ottenere i timestamp per le righe future.

C'è un modo per aggiungere una colonna timestamp con il valore predefinito NOW () in modo che non popoli i valori nelle righe precedenti ma solo per quelle future?

Se eseguo la ALTERquery, popola tutte le righe con timestamp:

ALTER TABLE mytable ADD COLUMN created_at TIMESTAMP DEFAULT NOW()

Risposte:


158

È necessario aggiungere la colonna con un valore predefinito di null, quindi modificare la colonna in modo che abbia l'impostazione predefinita now().

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

43

Puoi aggiungere la regola predefinita con la tabella di alterazione,

ALTER TABLE mytable ADD COLUMN created_at TIMESTAMP DEFAULT NOW()

quindi imposta immediatamente su null tutte le righe esistenti correnti:

UPDATE mytable SET created_at = NULL

Quindi da questo punto in DEFAULTpoi avrà effetto.


È buono in linea di principio, anche se ha il peso di un aggiornamento che potrebbe attivare trigger.
Philip Couling

7
@Artur: La soluzione presentata da Philip è la strada da percorrere. UPDATEnon è necessario. Se aggiungi un valore predefinito di colonna a una colonna esistente , le righe già esistenti non vengono modificate. L'impostazione predefinita viene compilata solo se aggiungi colonna e impostazione predefinita nello stesso comando.
Erwin Brandstetter

9

Ad esempio, creerò una tabella chiamata userscome di seguito e fornirò a una colonna denominata dateun valore predefinitoNOW()

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

Grazie


0

Prova qualcosa come: -

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

sostituendo table_namecon il nome del tuo tavolo.


qual è il vantaggio di un simile CONTSTRAINT?
rubo77
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.