Добавить столбец с отметкой времени по умолчанию NOW () только для новых строк

113

У меня есть таблица с тысячами строк. Поскольку изначально таблица не была построена с использованием столбца created_at, получить метку времени их создания невозможно. Однако очень важно начать получать отметки времени для будущих строк.

Есть ли способ добавить столбец отметки времени со значением по умолчанию NOW (), чтобы он не заполнял значения в предыдущих строках, а только для будущих?

Если я сделаю ALTERзапрос, он заполнит все строки меткой времени:

ALTER TABLE mytable ADD COLUMN created_at TIMESTAMP DEFAULT NOW()
Артур
источник

Ответы:

159

Вам нужно добавить столбец со значением по умолчанию null, а затем изменить столбец на значение по умолчанию now().

ALTER TABLE mytable ADD COLUMN created_at TIMESTAMP;
ALTER TABLE mytable ALTER COLUMN created_at SET DEFAULT now();
Филип Коулинг
источник
43

Вы можете добавить правило по умолчанию с помощью таблицы изменений,

ALTER TABLE mytable ADD COLUMN created_at TIMESTAMP DEFAULT NOW()

затем сразу же обнулить все текущие существующие строки:

UPDATE mytable SET created_at = NULL

Затем с этого момента DEFAULTвступят в силу.

Ренцо
источник
В принципе, это хорошо, хотя и требует обновления, которое может срабатывать триггеры.
Филип Коулинг,
8
@Artur: Решение, которое представил Филипп, - это верный путь. UPDATEне обязательно. Если вы добавите столбец по умолчанию к существующему столбцу, уже существующие строки не затронуты. Значение по умолчанию заполняется только в том случае, если вы добавляете столбец и значение по умолчанию в той же команде.
Эрвин Брандштеттер,
9

Например, я создам таблицу, названную usersниже, и дам столбцу с именем dateпо умолчанию.NOW()

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

Спасибо

Мустафа Ахмад Фати
источник
0

Попробуйте что-нибудь вроде: -

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

заменив table_nameимя вашей таблицы.

Майкл Гунгарам-Смит
источник
1
Какая польза от такого ПРОТИВОСТОЯНИЯ?
rubo77,