Dodaj kolumnę sygnatury czasowej z domyślnym TERAZ () tylko dla nowych wierszy

113

Mam tabelę z tysiącami wierszy. Ponieważ początkowo tabela nie została zbudowana z kolumną created_at, nie ma możliwości uzyskania ich sygnatury czasowej utworzenia. Ważne jest jednak, aby zacząć pobierać sygnatury czasowe dla przyszłych wierszy.

Czy istnieje sposób, aby dodać kolumnę sygnatury czasowej z wartością domyślną NOW (), aby nie wypełniała ona wartości w poprzednich wierszach, ale tylko w przyszłych?

Jeśli wykonam ALTERzapytanie, zapełni wszystkie wiersze datownikiem:

ALTER TABLE mytable ADD COLUMN created_at TIMESTAMP DEFAULT NOW()
Artur
źródło

Odpowiedzi:

159

Musisz dodać kolumnę z wartością domyślną null, a następnie zmienić kolumnę, aby miała wartość domyślną now().

ALTER TABLE mytable ADD COLUMN created_at TIMESTAMP;
ALTER TABLE mytable ALTER COLUMN created_at SET DEFAULT now();
Philip Couling
źródło
43

Możesz dodać domyślną regułę do tabeli alter,

ALTER TABLE mytable ADD COLUMN created_at TIMESTAMP DEFAULT NOW()

następnie natychmiast ustaw na null wszystkie bieżące istniejące wiersze:

UPDATE mytable SET created_at = NULL

Od tego momentu DEFAULTzaczną obowiązywać.

Renzo
źródło
Zasadniczo jest to dobre, chociaż niesie ciężar wykonania aktualizacji, która może uruchomić wyzwalacze.
Philip Couling
8
@Artur: Rozwiązanie przedstawione przez Philipa jest drogą do zrobienia. UPDATEto nie jest konieczne. Jeśli dodasz kolumnę domyślną do istniejącej kolumny, nie ma to wpływu na już istniejące wiersze. Wartość domyślna jest wypełniana tylko wtedy, gdy dodasz kolumnę i wartość domyślną w tym samym poleceniu.
Erwin Brandstetter
9

Na przykład utworzę tabelę o nazwie users jak poniżej i podam kolumnę o nazwie datedomyślnejNOW()

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

Dzięki

Mustafa Ahmad Fathy
źródło
0

Spróbuj na przykład: -

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

zastępując table_namenazwą swojego stołu.

Michael Gungaram-Smith
źródło
1
jaka jest korzyść z takiego KONTRASTU?
rubo77