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()

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();

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.


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


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.


Was ist der Vorteil einer solchen Einschränkung?
rubo77
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.