Поля "созданы в" и "обновлены в"
Это кажется очень простым, но я изо всех сил пытаюсь понять это. Я хочу, чтобы столбец в моей базе данных указывал, когда была создана запись, а другой столбец, который был указан при обновлении. Понятно, что я должен был все это сделать, используя 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 с другим