Додайте стовпець часової позначки за замовчуванням NOW () лише для нових рядків


112

У мене є таблиця, яка містить тисячі рядків. Оскільки таблиця спочатку не була побудована зі стовпцем create_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,

ALTER TABLE mytable ADD COLUMN created_at TIMESTAMP DEFAULT NOW()

потім негайно встановіть на нуль всі поточні існуючі рядки:

UPDATE mytable SET created_at = NULL

Тоді з цього моменту DEFAULTволя почне діяти.


В принципі, це добре, хоч він і несе вагу робити оновлення, яке може спрацьовувати.
Філіп Кулінг

8
@Artur: Рішення, яке Філіп представив, - це шлях. UPDATEне потрібно. Якщо ви додаєте стовпець за замовчуванням до існуючого стовпця, то вже існуючі рядки не впливають. За замовчуванням заповнюється лише якщо ви додасте стовпець і за замовчуванням в одну команду.
Erwin Brandstetter

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.