Fügen Sie eine Zeitstempelspalte mit der Standardeinstellung NOW () nur für neue Zeilen hinzu

111

Ich habe eine Tabelle mit Tausenden von Zeilen. Da die Tabelle anfangs nicht mit der Spalte created_at erstellt wurde, kann der Erstellungszeitstempel nicht abgerufen werden. Es ist jedoch wichtig, die Zeitstempel für zukünftige Zeilen abzurufen.

Gibt es eine Möglichkeit, eine Zeitstempelspalte mit dem Standardwert NOW () hinzuzufügen, damit die Werte nicht in vorherige Zeilen, sondern nur in zukünftige Zeilen eingefügt werden?

Wenn ich die ALTERAbfrage durchführe, werden alle Zeilen mit Zeitstempel gefüllt:

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

Antworten:

156

Sie müssen die Spalte mit dem Standardwert von hinzufügen nullund dann die Spalte so ändern, dass sie den Standardwert hat now().

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

Sie können die Standardregel mit der Änderungstabelle hinzufügen.

ALTER TABLE mytable ADD COLUMN created_at TIMESTAMP DEFAULT NOW()

Setzen Sie dann sofort alle aktuell vorhandenen Zeilen auf Null:

UPDATE mytable SET created_at = NULL

Ab diesem Zeitpunkt DEFAULTwird der wirksam.

Renzo
quelle
Es ist im Prinzip gut, obwohl es das Gewicht eines Updates hat, das Auslöser auslösen kann .
Philip Couling
7
@Artur: Die Lösung, die Philip vorgestellt hat, ist der richtige Weg. UPDATEist nicht nötig. Wenn Sie einer vorhandenen Spalte einen Spaltenstandard hinzufügen , sind bereits vorhandene Zeilen nicht betroffen. Die Standardeinstellung wird nur ausgefüllt, wenn Sie im selben Befehl eine Spalte und eine Standardeinstellung hinzufügen.
Erwin Brandstetter
9

Zum Beispiel werde ich eine Tabelle mit dem folgenden Namen erstellen usersund einer Spalte dateeinen Standardwert gebenNOW()

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

Vielen Dank

Mustafa Ahmad Fathy
quelle
0

Versuchen Sie etwas wie: -

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

Ersetzen table_namedurch den Namen Ihrer Tabelle.

Michael Gungaram-Smith
quelle
Was ist der Vorteil einer solchen Einschränkung?
rubo77