日期时间列的默认值错误
Error on default value with datetime column
我正在通过 phpmyadmin 尝试以下查询来创建一个新的 table:
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 语句一起使用,但不是默认值。
为什么不作为默认值工作?
我需要触发器吗?
你必须使用 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));
MariaDB 或 MySQL 不支持默认值的表达式。来自 MariaDB documentation:
You must provide a constant default value instead. The one exception
is that you may use CURRENT_TIMESTAMP as the default value for a
TIMESTAMP column to use the current timestamp at insertion time.
另请参阅 MySQL 中与同一主题相关的 the MySQL documentation and a previous Whosebug question。
这是您需要的触发器:
DELIMITER //
CREATE TRIGGER expiryDateTrigger BEFORE INSERT on token
FOR EACH ROW
BEGIN
SET expiration_date = CURRENT_TIMESTAMP + INTERVAL 1 HOUR;
END//
DELIMITER ;
这里是 fiddle 显示它的运行情况:http://sqlfiddle.com/#!9/f8f53/1
创建触发器时需要更改分隔符,以便您可以在触发器定义中使用分号。
我正在通过 phpmyadmin 尝试以下查询来创建一个新的 table:
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 语句一起使用,但不是默认值。 为什么不作为默认值工作? 我需要触发器吗?
你必须使用 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));
MariaDB 或 MySQL 不支持默认值的表达式。来自 MariaDB documentation:
You must provide a constant default value instead. The one exception is that you may use CURRENT_TIMESTAMP as the default value for a TIMESTAMP column to use the current timestamp at insertion time.
另请参阅 MySQL 中与同一主题相关的 the MySQL documentation and a previous Whosebug question。
这是您需要的触发器:
DELIMITER //
CREATE TRIGGER expiryDateTrigger BEFORE INSERT on token
FOR EACH ROW
BEGIN
SET expiration_date = CURRENT_TIMESTAMP + INTERVAL 1 HOUR;
END//
DELIMITER ;
这里是 fiddle 显示它的运行情况:http://sqlfiddle.com/#!9/f8f53/1
创建触发器时需要更改分隔符,以便您可以在触发器定义中使用分号。