datetime列的默认值出错

时间:2015-03-30 00:57:53

标签: php mariadb

我通过phpmyadmin尝试以下查询来创建一个新表:

CREATE TABLE IF NOT EXISTS `app`.`token` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `token` VARCHAR(64) NOT NULL,
  `creation_date` DATETIME NOT NULL DEFAULT NOW(),
  `expiration_date` DATETIME NOT NULL DEFAULT NOW() + INTERVAL 1 HOUR,
  PRIMARY KEY (`id`))
ENGINE = InnoDB;

我收到以下错误:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '+ INTERVAL 1 HOUR,
  PRIMARY KEY (`id`))
ENGINE = InnoDB' at line 5

如果我删除了expiration_date的默认值,或者只将其更改为NOW(),则查询成功。

此外,以下查询也是成功的:

INSERT INTO `app`.`token` (`token`,`expiration_date`) VALUES ('b1ae528de7ec8355a655926fcb84397f5d21d604e232b6567471c84610a171a8', NOW() + INTERVAL 1 HOUR);

NOW()+ INTERVAL 1 HOUR可以使用INSERT语句,但不能作为默认值。 为什么不作为默认值? 我需要一个触发器吗?

3 个答案:

答案 0 :(得分:2)

MariaDB或MySQL不支持默认值的表达式。来自MariaDB documentation

  

您必须提供一个常量默认值。一个例外   是你可以使用CURRENT_TIMESTAMP作为a的默认值   TIMESTAMP列在插入时使用当前时间戳。

另请参阅与MySQL中相同主题相关的the MySQL documentationa previous StackOverflow question

答案 1 :(得分:2)

以下是您需要的触发器:

DELIMITER //
CREATE TRIGGER expiryDateTrigger BEFORE INSERT on token
FOR EACH ROW
BEGIN
  SET expiration_date = CURRENT_TIMESTAMP + INTERVAL 1 HOUR;
END//
DELIMITER ;

这是一个在操作中显示它的小提琴:http://sqlfiddle.com/#!9/f8f53/1

创建触发器时需要更改分隔符,以便在触发器定义中使用分号。

答案 2 :(得分:0)

您必须使用DATE_ADD mysql函数

http://www.w3schools.com/sql/func_date_add.asp

因此您的查询将更改为此

INSERT INTO `app`.`token` (`token`,`expiration_date`) VALUES ('b1ae528de7ec8355a655926fcb84397f5d21d604e232b6567471c84610a171a8', DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 1 HOUR));