MySQL, таблица с двумя датами? - PullRequest
1 голос
/ 07 января 2011

У меня есть таблица, где мне нужно и firstmod, и lastmod

firstmod должен быть отметкой времени создания строки.lastmod должен обновить себя до текущего времени.

Это то, что у меня есть до сих пор ..

CREATE  TABLE IF NOT EXISTS `SiteGen_JamesM_Live`.`PAGES` (
  `ID` INT(11) NOT NULL AUTO_INCREMENT ,
  `USER_ID` INT(11) NOT NULL ,
  `TITLE` VARCHAR(100) NOT NULL ,
  `HTML` LONGTEXT NOT NULL ,
  `FIRSTMOD` TIMESTAMP NOT NULL DEFAULT 0 ,
  `LASTMOD` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,
  PRIMARY KEY (`ID`) )
ENGINE = InnoDB
AUTO_INCREMENT = 5
DEFAULT CHARACTER SET = latin1

И вот что я получаю взамен:

Executing SQL script in server
ERROR: Error 1067: Invalid default value for 'FIRSTMOD'

Ответы [ 4 ]

0 голосов
/ 07 января 2011

попробуйте

CREATE TABLE IF NOT EXISTS `PAGES` (
  `ID` INT(11) NOT NULL AUTO_INCREMENT ,
  `USER_ID` INT(11) NOT NULL ,
  `TITLE` VARCHAR(100) NOT NULL ,
  `HTML` LONGTEXT NOT NULL ,
  `FIRSTMOD` datetime NOT NULL,  
  `LASTMOD` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,
  PRIMARY KEY (`ID`) )
ENGINE = InnoDB
AUTO_INCREMENT = 5
DEFAULT CHARACTER SET = latin1 

и настройте триггер для обновления FIRSTMOD при вставке

Create Trigger Insert_PAGES
  After INSERT On PAGES
  For Each Row
  Begin
   set new.FIRSTMOD = now();
  End

Это установит время firstmod = now ()когда запись создана и lastmod обновит себя до текущего времени, когда будут внесены какие-либо изменения в запись

0 голосов
/ 07 января 2011

В таблице может быть только один столбец с CURRENT_TIMESTAMP. Вы должны выбрать, будет ли он с DEFAULT (при вставке) или с ON UPDATE (или вы можете иметь оба модификатора, но в одном столбце).

Есть и хитрость, и то, и другое, но, поскольку оно недокументировано, оно также ненадежно (на самом деле я не уверен, что оно все еще работает).

Подробнее здесь: http://dev.mysql.com/doc/refman/5.5/en/timestamp.html

Для одного столбца TIMESTAMP в таблице, Вы можете назначить текущую метку времени в качестве значения по умолчанию и значение автообновления. Можно текущая временная метка будет значение по умолчанию для инициализации столбец, для значения автообновления, или и то и другое. Невозможно иметь текущая отметка времени будет значением по умолчанию за один столбец и автообновление значение для другого столбца

В качестве обходного пути вы можете использовать триггер BEFORE INSERT или BEFORE UPDATE, чтобы установить одно из этих значений.

0 голосов
/ 07 января 2011

Попробуйте это:

`FIRSTMOD` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00' ,
`LASTMOD` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,

, а затем в ваших вставках

INSERT INTO PAGES (FIRSTMOD, LASTMOD) VALUES (NULL, NULL)

Столбец FIRSTMOD должен получить действительную временную метку при вставке, а LASTMOD должен автоматически обновляться после этого.

0 голосов
/ 07 января 2011

Я рискну ответить, хотя я не очень знаком с MySQL.

Я предполагаю, что столбец lastmod должен быть определен:

 `LASTMOD` TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP ,

без DEFAULTуточнить.По умолчанию это будет указано в предложении ON UPDATE.

EDIT:

Упс, не стоит рисковать этими вещами.Из руководства:

Невозможно, чтобы текущая временная метка была значением по умолчанию для одного столбца и значением автоматического обновления для другого столбца.

...