поля «созданы в» и «обновлены в» - PullRequest
14 голосов
/ 03 августа 2010

Это кажется очень простым, но я изо всех сил пытаюсь понять это. Мне нужен столбец в моей базе данных, в котором указано, когда запись была впервые создана, и другой столбец, в котором указано, когда она была обновлена. Насколько я понимаю, я должен быть в состоянии сделать все это только с помощью MySQL. Вся помощь приветствуется:)

Это воняет до сих пор нет ответа, причины, по которым я уже начинаю скучать по Ruby on Rails ...

Ответы [ 5 ]

7 голосов
/ 03 августа 2010

Возможно, вам потребуется использовать комбинацию типа данных Datetime и типа данных Timestamp.Я бы установил мой столбец created как DateTime с DEFAULT NOW(), а мой столбец updated как Timestamp с DEFAULT CURRENT_TIMESTAMP и атрибутом ON UPDATE CURRENT_TIMESTAMP.

Вот документы для Timestamp dt:

http://dev.mysql.com/doc/refman/5.0/en/timestamp.html

В операторе CREATE TABLE первый столбец TIMESTAMP может быть объявлен в любомиз следующих способов:

С предложениями DEFAULT CURRENT_TIMESTAMP и ON UPDATE CURRENT_TIMESTAMP столбец имеет текущую метку времени для значения по умолчанию и автоматически обновляется.

Без предложений DEFAULT или ON UPDATE, это то же самое, что DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP.

С предложением DEFAULT CURRENT_TIMESTAMP и отсутствием предложения ON UPDATE столбец имеет текущую метку времени для своего значения по умолчанию, но не обновляется автоматически.

Без предложения DEFAULT и с предложением ON UPDATE CURRENT_TIMESTAMP для столбца по умолчанию установлено значение 0 и оно автоматически обновляется.

При постоянном значении DEFAULT столбец имеет заданное значение по умолчанию и не инициализируется автоматическитекущая метка времени.Если столбец также имеет предложение ON UPDATE CURRENT_TIMESTAMP, он автоматически обновляется;в противном случае он имеет постоянное значение по умолчанию и не обновляется автоматически.

1 голос
/ 27 февраля 2012

Чтобы ответить на ваш вопрос и посмотреть другие вопросы, вот ответ.Обратите внимание, что это было написано для MySQL 5.x.

DROP TABLE IF EXISTS `test1`;
CREATE  TABLE `test1` (
  `id` INT NULL AUTO_INCREMENT ,
  `name` varchar(50) NOT NULL ,
  `created` DATETIME ,
  `updated` DATETIME ,
  PRIMARY KEY (`id`),
  INDEX (`name`)
);

DELIMITER $$
DROP TRIGGER IF EXISTS `test1_created`$$
CREATE TRIGGER `test1_created` BEFORE INSERT ON `test1` 
    FOR EACH ROW BEGIN
      SET NEW.`created` = UTC_TIMESTAMP();
      SET NEW.`updated` = UTC_TIMESTAMP();
    END;
$$
DROP TRIGGER IF EXISTS `test1_updated`$$
CREATE TRIGGER `test1_updated` BEFORE UPDATE ON `test1` 
    FOR EACH ROW BEGIN
      SET NEW.`updated` = UTC_TIMESTAMP();
    END;
$$
DELIMITER ;

Примечание

Вы можете использовать TIMESTAMP для столбца updated, который автоматически обновит значение таким образомне требует триггера BEFORE UPDATE, однако TIMESTAMP имеет диапазон от 1970 до 2038, который быстро приближается, и мне нравится думать, что мои приложения будут жить вечно :).Хотя значение TIMESTAMP составляет всего 4 байта, а DATETIME - 8 байтов.

TIMESTAMP range '1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC

DATETIME range '1000-01-01 00:00:00' to '9999-12-31 23:59:59'

0 голосов
/ 26 февраля 2015

Из Руководства по сертификации MySQL 5.0:

CREATE TABLE ts_test5 (
  created TIMESTAMP DEFAULT 0,
  updated TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  data CHAR(30)
);

Чтобы управлять поведением инициализации и обновления столбца TIMESTAMP, добавьте один или оба атрибута DEFAULT CURRENT_TIMESTAMP и ON UPDATE CURRENT_TIMESTAMP вОпределение столбца при создании таблицы с помощью CREATE TABLE ... и ... если вы не укажете ни один из атрибутов DEFAULT CURRENT_TIMESTAMP или ON UPDATE CURRENT_TIMESTAMP при создании таблицы, MySQL автоматически назначит BOTH первому столбцу TIMESTAMP

Также

вы не можете использовать DEFAULT CURRENT_TIMESTAMP с одним столбцом и ON UPDATE CURRENT_TIMESTAMP с другим

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

Вам понадобятся два поля «Создано» и «Обновлено» с типом datetime.Когда новая запись вставлена, вставьте «Создано» с отметкой текущего времени.Когда происходит обновление, вставьте «Обновлено» с текущей отметкой времени и оставьте поле «Создано» без изменений.

Для отметки текущего времени вы можете использовать NOW () в вашем запросе mysql.*

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

Если вы не можете использовать поля меток времени с атрибутами по умолчанию, предложенными Полом В., вы можете использовать триггеры AFTER INSERT и AFTER UPDATE для заполнения полей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...