MySQL Datetime & timestamp для уровня строки и уровня таблицы - PullRequest
2 голосов
/ 15 ноября 2010

Мне нужно иметь три столбца во всех моих таблицах, чтобы отразить их в соответствии с требованиями:

  • Создать дату / время -> Дата и время создания строки.Это значение никогда не должно измениться навсегда.
  • Дата и время изменения -> Дата и время только части строки, которые были изменены в последний раз.Это значение всегда будет меняться при изменении какой-либо детали в строке.
  • Дата / время обновления -> Дата и время последнего обновления всей строки.Это значение всегда будет меняться при изменении всех деталей в строке.

Кроме того, мне нужно сохранить те же данные, но на уровне таблицы ->
- таблица даты / времени была создана
- дата / время последней вставки строки
- дата / время последнего редактирования.

Итак, два вопроса:

1) Для трех строковых случаев даты / времени: какой из них должен быть датой-временем, а какой - временной отметкой?
2) Для даты на уровне трех таблиц/ times: Могу ли я как-то сохранить это в той же таблице или мне нужна отдельная таблица для хранения этой информации, и какие функции я могу использовать для этого?

Конечная цель - автоматизировать эти дату / время, потому чтоМногие данные, такие как таблицы поиска, будут вводиться / редактироваться конечными пользователями из внешнего интерфейса, поэтому мне нужно, чтобы БД самостоятельно выполняла все дату / время сзади без каких-либо ручных вставок для этих столбцов.

Кроме того, мне нужно создавать отчеты по этим датам / временам, следовательно, необходимо убедиться, что ими можно манипулировать на уровне кода, чтобы разбить дату / время на дни, недели, месяцы, годы, часы и минуты.

Ответы [ 2 ]

1 голос
/ 15 ноября 2010

Боюсь, это невозможно.Это действительно глупый недостаток, но в документации говорит:

Для одного столбца TIMESTAMP в таблице вы можете назначить текущую метку времени в качестве значения по умолчанию и автоматическоеобновить значение.Возможно, текущая временная метка будет значением по умолчанию для инициализации столбца, для значения автообновления или для обоих.Невозможно, чтобы текущая временная метка была значением по умолчанию для одного столбца и значением автоматического обновления для другого столбца.

Отметка времени на уровне таблицы и создание отчетов могут быть выполнены просто, используя MAX() и GROUP BY.

0 голосов
/ 15 ноября 2010

Если вы хотите сделать это полностью с помощью SQL, а не вычислять метки времени обновления в коде приложения, вам придется добавить еще одну таблицу.Ваша основная таблица будет иметь только одно поле отметки времени - дату создания, которая по умолчанию будет CURRENT_TIMESTAMP и никогда не изменится.Ваша вторая таблица, main_updates, будет выглядеть примерно так:

CREATE TABLE main_updates(
main_id INT UNSIGNED NOT NULL REFERENCES main(main_id),
update_type ENUM('partial','complete'),
update_time TIMESTAMP DEFAULT CURRENT TIMESTAMP) 

Тогда у вас есть выбор.Если вам нужна запись обо всех когда-либо сделанных обновлениях, не устанавливайте первичный ключ и только вставьте в эту таблицу.Если вы хотите записать только самые последние значения, установите первичный ключ на main_id вместе с update_type, а для update_time - ON UPDATE CURRENT_TIMESTAMP.

Затем вы можете написать триггер, который будет срабатывать при каждом обновлении main.

Но на самом деле намного проще просто позволить вашему прикладному уровню устанавливать время обновления.

...