Ajouter une colonne d'horodatage avec NOW par défaut () pour les nouvelles lignes uniquement

112

J'ai une table qui a des milliers de lignes. Puisque la table n'a pas été construite avec la colonne created_at initialement, il n'y a aucun moyen d'obtenir leur horodatage de création. Il est cependant crucial de commencer à obtenir les horodatages pour les lignes futures.

Existe-t-il un moyen d'ajouter une colonne d'horodatage avec la valeur par défaut NOW () afin qu'elle ne remplisse pas les valeurs des lignes précédentes, mais uniquement des futures?

Si je fais la ALTERrequête, elle remplit toutes les lignes avec horodatage:

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

Réponses:

159

Vous devez ajouter la colonne avec une valeur par défaut de null, puis modifier la colonne pour avoir la valeur par défaut now().

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

Vous pouvez ajouter la règle par défaut avec la table alter,

ALTER TABLE mytable ADD COLUMN created_at TIMESTAMP DEFAULT NOW()

puis définissez immédiatement sur null toutes les lignes existantes actuelles:

UPDATE mytable SET created_at = NULL

Ensuite, à partir de ce moment, le DEFAULTprendra effet.

Renzo
la source
C'est bien en principe, même si cela porte le poids de faire une mise à jour qui peut déclencher des déclencheurs.
Philip Couling
8
@Artur: La solution présentée par Philip est la voie à suivre. UPDATEn'est pas nécessaire. Si vous ajoutez une colonne par défaut à une colonne existante , les lignes déjà existantes ne sont pas affectées. La valeur par défaut n'est renseignée que si vous ajoutez la colonne et la valeur par défaut dans la même commande.
Erwin Brandstetter
9

Par exemple, je vais créer une table appelée userscomme ci-dessous et donner une colonne nommée dateune valeur par défautNOW()

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

Merci

Mustafa Ahmad Fathy
la source
0

Essayez quelque chose comme: -

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

en remplaçant table_namepar le nom de votre table.

Michael Gungaram-Smith
la source
1
quel est l'avantage d'un tel CONTSTRAINT?
rubo77 le