Поля "созданы в" и "обновлены в"

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

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

Ответы

Ответ 1

Вам, вероятно, потребуется использовать комбинацию типа данных Datetime и типа данных Timestamp. Я бы установил столбец created как Datetime с столбцом DEFAULT NOW() и my 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, оно автоматически обновляется; в противном случае он имеет постоянное значение по умолчанию и не обновляется автоматически.

Ответ 2

Чтобы выполнить свой вопрос, и для других, рассматривающих этот вопрос, вот ответ. Обратите внимание, что это было написано для 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, который автоматически обновил значение, не требуя триггера ДО ПЕРЕДАЧИ, однако 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'

Ответ 3

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

Ответ 4

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

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

Ответ 5

В Руководстве по сертификации 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 с другим