2010-08-15 3 views
9

Я создаю несколько таблиц, где я хочу сохранить время создания записи и ее последнего обновления. Я думал, что у меня может быть два поля временной метки, где бы имелось значение CURRENT_TIMESTAMP, а у другого было бы CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP. Но я думаю, я не могу этого сделать, потому что у вас может быть только одно поле timestamp со значением по умолчанию в таблице?MySQL создает временную отметку времени и времени обновления

Как бы вы порекомендовали мне получить и хранить два раза? Благодаря!

ответ

8

В одной таблице могут быть два столбца типа timestamp.

следующие работы для MySQL 5,0

 
create table t 
(
    id integer, 
    created_at timestamp default current_timestamp, 
    updated_at timestamp 
); 

Я думаю, что вы путаете это с SQL Server (где метка времени не действительно «штамп времени» и есть на самом деле ограничение на один столбец «метки времени»)

Редактирование: при каждом изменении строки вам понадобится триггер для обновления столбца update_at.

+0

Правильно, временная метка SQL Server на самом деле является синонимом для rowversion – SQLMenace

+0

Это будет выполняться, но поле updated_at не получает autoupdated при изменении. Я думал, что добавление ON UPDATE CURRENT_TIMESTAMP в столбец updated_at позаботится об этом. То есть, когда он жалуется, что это невозможно сделать. – Aishwar

+0

Да, как я уже сказал: вам нужно использовать триггер для заполнения столбца updated_at. –

2

Насколько я знаю, для этого ограничения не существует обходного пути. Вам нужно вручную установить (по крайней мере) одну из временных меток, самый простой способ - просто добавить updated = NOW() в UPDATE -query.

+0

+1 Это похоже, как работоспособное решение. Мне бы очень понравилось, если бы сервер мог сделать это автоматически :) – Aishwar

+0

Возможно, с триггерами это возможно, но я думаю, что это не отличное решение. –

+0

Обычно это делается наоборот: вы вручную указываете 'created = NOW()' и 'updated' устанавливается автоматически.Причина в том, что вы создаете запись 1 раз, но обновления могут быть неограниченными. – Stalinko

0

Вам понадобятся две колонки: CREATE_TIME и UPDATE_TIME.

Возможно, вы захотите добавить CREATE_USER и UPDATE_USER.

Возможно, вы захотите иметь отношения 1: многие с измененным именем столбца, старыми и новыми значениями.

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

+0

У меня есть 2 столбца для хранения времени создания и времени обновления, но я не могу установить два значения по умолчанию, указанные выше. Я посмотрю, что такое CDC. Разве не должно быть простого решения? Я бы подумал, что это общий сценарий. – Aishwar

+0

Это обычное дело, но я не верю, что у MySQL есть встроенное решение для него. Oracle и SQL Server. Не должно быть трудно сделать: несколько таблиц и триггеров. – duffymo

0

Я бы оставил текущую временную метку так, как вы предлагали, и заполните поле created_at с текущей датой вставки.

14

Хороший способ для создания полей, как «создал» и «обновленный» является

CREATE TABLE `mytable` ( 
`id` INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, 
`created` TIMESTAMP DEFAULT '0000-00-00 00:00:00', 
`updated` TIMESTAMP DEFAULT now() ON UPDATE now(), 
`myfield` VARCHAR(255) 
); 

И его необходимо ввести аннулирует в обеих колонках во время «вставить»:

INSERT INTO mytable (created,updated,myfield) VALUES (null,null,'blablabla'); 

И теперь, во всех обновлениях «обновленное» поле будет иметь новое значение с фактической датой.

UPDATE mytable SET myfield='blablablablu' WHERE myfield='blablabla'; 

Источник: http://gusiev.com/2009/04/update-and-create-timestamps-with-mysql/

+2

Это лучшее решение, которое я нашел. Магия в том, что NULL переводится в СЕЙЧАС() на вставке. В типичном приложении будет больше способов обновить строку, чем создавать ее, поэтому это становится меньше обслуживания, чем использование «одного сейчас» для создания и обработки вручную обновлений с использованием отдельного триггера или другого подхода. – botimer

+1

Работали чудесно! Хотя в моей ситуации мне не нужно было передавать нулевые значения, и только обновленный столбец был изменен. Кажется, хорошо работает. 'created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP В UPDATE CURRENT_TIMESTAMP,' ... – Jordan

7

По MYSQL версии 5.6.5 вы можете сделать это с помощью DEFAULT и ON UPDATE. Триггеры не нужны.

ts_create TIMESTAMP DEFAULT CURRENT_TIMESTAMP, ts_update TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

+0

Прямо сейчас это лучший ответ! – v010dya

Смежные вопросы