目录
你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。
异常代码
DROP TABLE IF EXISTS `tb_order_status`;
CREATE TABLE `tb_order_status` (
`order_id` bigint(20) NOT NULL COMMENT '订单id',
`status` int(1) DEFAULT NULL COMMENT '状态:1、未付款 2、已付款,未发货 3、已发货,未确认 4、交易成功 5、交易关闭 6、已评价',
`create_time` datetime DEFAULT NULL COMMENT '订单创建时间',
`payment_time` datetime DEFAULT NULL COMMENT '付款时间',
`consign_time` datetime DEFAULT NULL COMMENT '发货时间',
`end_time` datetime DEFAULT NULL COMMENT '交易完成时间',
`close_time` datetime DEFAULT NULL COMMENT '交易关闭时间',
`comment_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '评价时间',
PRIMARY KEY (`order_id`),
KEY `status` (`status`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='订单状态表';
异常原因
通过查询语句
show variables like 'innodb_version';
可知当前mysql版本为5.5.62,查阅网上资料,为MySQL 5.5 每个表只允许一个列的默认值根据时间戳生成时间(但实际上这个表也确实只有一个列的默认值是更具时间戳生成的,依然报错,这里有点不太懂,希望朋友们解惑)
解决办法
1.更换5.6及以上版本mysql
2.使用触发器替代
`comment_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '评价时间',
中的ON UPDATE CURRENT_TIMESTAMP
代码如下:
DROP TRIGGER IF EXISTS `tb_order_status`;
DELIMITER//
CREATE TRIGGER `tb_order_status` BEFORE UPDATE ON `tb_order_status`
FOR EACH ROW SET new.`comment_time` = NOW()
//
DELIMITER ;
补充
不太熟悉 语句中DELIMITER 的用法,简单查询了一下用法
DELIMITER实际上是告诉Mysql解释器语句是否结束的标志,而DELIMITER// 表示重新定义//为结束标志。通常是有时候希望输入较多语句,且语句中含有分号才会这么做,比如:
mysql> delimiter //
mysql> CREATE FUNCTION `SHORTEN`(S VARCHAR(255), N INT)
mysql> RETURNS varchar(255)
mysql> BEGIN
mysql> IF ISNULL(S) THEN
mysql> RETURN '';
mysql> ELSEIF N<15 THEN
mysql> RETURN LEFT(S, N);
mysql> ELSE
mysql> IF CHAR_LENGTH(S) <=N THEN
mysql> RETURN S;
mysql> ELSE
mysql> RETURN CONCAT(LEFT(S, N-10), '...', RIGHT(S, 5));
mysql> END IF;
mysql> END IF;
mysql> END;//
但此次遇到的错误,并没含有较多分号,不需要DELIMITER如下改正亦可
DROP TRIGGER IF EXISTS `tb_order_status`;
CREATE TRIGGER `tb_order_status` BEFORE UPDATE ON `tb_order_status`
FOR EACH ROW SET new.`comment_time` = NOW();
但是网上查到的解决方法语句里都有DELIMITER关键字,不知是否我理解有所遗漏,希望朋友们可以指出
参考: https://blog.csdn.net/miracleoa/article/details/100033771
https://www.cnblogs.com/nickup/p/6628892.html