|
MySQL.RU - Webboard
Вернуться
два TIMESTAMP-а в MySQL 5.0 (Dinky) 07/11/2005 - 21:15:57
Re: два TIMESTAMP-а в MySQL 5.0 (Artemeey) 15/11/2010 - 09:42:58
Re: два TIMESTAMP-а в MySQL 5.0 (CrazyTimon) 24/05/2012 - 11:46:47
From: Dinky - 07/11/2005 - 21:15:57
Subject:два TIMESTAMP-а в MySQL 5.0
-----------------
http://www.futhark.ch/mysql/108.html
в моем вольном переводе с сокращениями:
================================================
В MySQL 4.1 появилась возможность контролировать поведение полей TIMESTAMP - обновление только на UPDATE или на INSERT или на оба сразу, но в MySQL 5.0 можно добиться бОльшего с применением триггеров.
Вот, к примеру, хотелось бы сделать так:
CREATE TABLE blog_entries (
`published` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`updated` TIMESTAMP DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP,
`title` VARCHAR(128)
);
Но это не будет работать в MySQL 5.0:
ERROR 1293 (HY000): Incorrect table definition; there can be only one
TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause
Вместо этого можно пойти другим путем:
1) создаем таблицу:
CREATE TABLE blog_entries (
`published` TIMESTAMP DEFAULT '0000-00-00 00:00:00',
`updated` TIMESTAMP DEFAULT '0000-00-00 00:00:00',
`title` VARCHAR(128)
);
заметим, что MySQL не будет автоматически обновлять эти поля
2) пишем два триггера - на вставку и обновление:
CREATE TRIGGER blog_entries_publish BEFORE INSERT ON `blog_entries`
FOR EACH ROW SET NEW.published = NOW(), NEW.updated = '0000-00-00 00:00:00';
CREATE TRIGGER blog_entries_update BEFORE UPDATE ON `blog_entries`
FOR EACH ROW SET NEW.updated = NOW(), NEW.published = OLD.published;
Будет работать, но нельзя будет задать значения этих полей в запросах - триггеры все перепишут по-своему. Если необходимо иметь такую более гибкую функциональность:
CREATE TRIGGER blog_entries_publish BEFORE INSERT ON `blog_entries` FOR EACH ROW SET
NEW.published = IFNULL(NEW.published, NOW()),
NEW.updated = IFNULL(NEW.updated, '0000-00-00 00:00:00');
CREATE TRIGGER blog_entries_update BEFORE UPDATE ON `blog_entries` FOR EACH ROW SET
NEW.updated = CASE
WHEN NEW.updated IS NULL THEN OLD.updated
WHEN NEW.updated = OLD.updated THEN NOW()
ELSE NEW.updated
END,
NEW.published = IFNULL(NEW.published, OLD.published);
================================================
--
Dmitry
[Это сообщение - спам!]
Последние сообщения из форума
Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL,
версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
41326
|
|