MySQL создает время и обновляет временную метку - PullRequest
12 голосов
/ 15 августа 2010

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

Как бы вы посоветовали мне взять и сохранить два раза? Спасибо!

Ответы [ 6 ]

24 голосов
/ 22 февраля 2014

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

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/

16 голосов
/ 05 июня 2015

Начиная с MYSQL версии 5.6.5, вы можете сделать это, используя DEFAULT и ON UPDATE. Триггеры не нужны.

ts_create TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

ts_update TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

12 голосов
/ 15 августа 2010

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

Следующее работает для MySQL 5.0

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

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

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

2 голосов
/ 15 августа 2010

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

0 голосов
/ 15 августа 2010

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

0 голосов
/ 15 августа 2010

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

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

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

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

...