Agregue la columna de marca de tiempo con el valor predeterminado NOW () solo para filas nuevas

111

Tengo una tabla que tiene miles de filas. Dado que la tabla no se construyó inicialmente con la columna created_at, no hay forma de obtener su marca de tiempo de creación. Sin embargo, es crucial comenzar a obtener las marcas de tiempo para las filas futuras.

¿Hay alguna forma de que pueda agregar una columna de marca de tiempo con el valor predeterminado AHORA () para que no llene los valores de las filas anteriores, sino solo para las futuras?

Si hago la ALTERconsulta, llena todas las filas con la marca de tiempo:

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

Respuestas:

158

Debe agregar la columna con un valor predeterminado de null, luego modificar la columna para que tenga el valor predeterminado now().

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

Puede agregar la regla predeterminada con la tabla de modificación,

ALTER TABLE mytable ADD COLUMN created_at TIMESTAMP DEFAULT NOW()

luego establezca inmediatamente en nulo todas las filas existentes actuales:

UPDATE mytable SET created_at = NULL

Entonces, a partir de este momento, DEFAULTentrará en vigor.

Renzo
fuente
Es bueno en principio, aunque tiene el peso de hacer una actualización que puede disparar disparadores.
Philip Couling
7
@Artur: La solución que presentó Philip es el camino a seguir. UPDATEno es necesario. Si agrega una columna predeterminada a una columna existente , las filas ya existentes no se verán afectadas. El valor predeterminado solo se completa si agrega una columna y el valor predeterminado en el mismo comando.
Erwin Brandstetter
9

Por ejemplo, crearé una tabla llamada userscomo se muestra a continuación y daré una columna llamada dateun valor predeterminadoNOW()

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

Gracias

Mustafa Ahmad Fathy
fuente
0

Prueba algo como: -

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

reemplazando table_namecon el nombre de su tabla.

Michael Gungaram-Smith
fuente
¿Cuál es el beneficio de tal RESTRICCIÓN?
rubo77