SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 10.08.2008 01:43:05

Shopen
Гуру
Откуда: Москва
Зарегистрирован: 22.10.2007
Сообщений: 362

TIMESTAMP

Господа, подскажите пожалуйста, какие должны быть два поля, чтобы первое автоматически устанавливалось в текущую дату и не менялось позже при обновлении записи, а второе поле устанавливалось в текущую дату при каждом обновлении записи. (т.е. дата создания и дата модификации)

Понимаю, что думать в сторону TIMESTAMP - но там такой мутный набор атрибутов, что не могу поняти как решить с их помощью данную задачу.
Или это можно решить только триггерами или скриптом?

Неактивен

 

#2 10.08.2008 01:50:38

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: TIMESTAMP

Мы такое реализуем с помощью триггера, в таком виде:

CREATE TABLE materials (
  `lastmodified` timestamp NOT NULL default '0000-00-00 00:00:00' on update CURRENT_TIMESTAMP,
  `created` timestamp NOT NULL default '0000-00-00 00:00:00');
DELIMITER //
CREATE TRIGGER `materials_bi` BEFORE INSERT ON materials
BEGIN
DECLARE now DATETIME;
SET now = NOW();
SET NEW.created = now;
SET NEW.lastmodified = now;
END //

Неактивен

 

#3 13.08.2008 03:01:18

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: TIMESTAMP

Такое можно реализовать и без триггера:

CREATE TABLE tbl (
created TIMESTAMP DEFAULT 0,
lastmodified TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
 


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

Неактивен

 

#4 13.08.2008 12:53:05

Sign
Гуру
Зарегистрирован: 26.06.2008
Сообщений: 43

Re: TIMESTAMP

LazY написал:

Такое можно реализовать и без триггера:

CREATE TABLE tbl (
created TIMESTAMP DEFAULT 0,
lastmodified TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
 


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

Без тригера можно и не мудрствовать лукаво со вставками NULL ; )

CREATE TABLE tbl (
    created date NOT NULL,
    lastmodified TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

просто при вставке писать now()  для поля created

Неактивен

 

#5 13.08.2008 17:22:10

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: TIMESTAMP

В итоге мы на webew.ru пришли к выводу, что с триггером удобнее, так как чем меньше разработчик знает про эти поля, тем более корректная информация в них содержится.

Неактивен

 

#6 13.08.2008 21:13:56

Sign
Гуру
Зарегистрирован: 26.06.2008
Сообщений: 43

Re: TIMESTAMP

Не могу с Вами не согласиться, но сервера версии < 5 ещё встречаются

Неактивен

 

#7 13.08.2008 21:36:27

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: TIMESTAMP

К несчастью, да.
Более того, для создания триггера нужен SUPERUSER, чего также нередко не бывает.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson