我有一个包含名为“start_date”的列的表,该列是一个日期时间,不能为null。我想在一个更新查询中为所有日期时间添加一小时,但它给出了错误消息UPDATE tbl_event SET start_date = DATE_ADD(start_date, INTERVAL 1 HOUR);
我正在使用MySQL 5.7.17和以下查询:
CREATE TABLE `tbl_event` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`created_by` int(11) DEFAULT NULL,
`name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`start_date` datetime NOT NULL,
`end_date` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `FK_EVENT_CREATED_BY` (`created_by`),
CONSTRAINT `FK_EVENT_CREATED_BY` FOREIGN KEY (`created_by`) REFERENCES `tbl_user` (`id`) ON DELETE SET NULL,
) ENGINE=InnoDB AUTO_INCREMENT=442 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
当我在一行中执行它时,它可以正常工作,但是当我想要更改所有内容时则不行。我在这里错过了什么吗?
编辑:以下是表格的创建语法:
.text()
答案 0 :(得分:2)
除非发生一些非常奇怪的事情,否则我认为唯一可能导致问题的是,如果start_date
中至少有一个(非NULL)值,那么向它添加一小时就会产生NULL
例如,可能存在可将结果推到有效datetime
范围内的值;我认为这会在某些MySQL版本中重现您的问题。
(正如你现在在评论中明确指出的那样,并且正如GhostGambler所建议的那样,价值观是旧的MySQL"零日期"(0000-00-00 00:00:00
)表现出一些奇怪的行为,包括从NULL
产生DATE_ADD
。)
您可以找到包含导致问题的值的行:
SELECT * FROM tbl_event WHERE DATE_ADD(start_date, INTERVAL 1 HOUR) IS NULL;
...然后根据您找到的内容从那里开始纠正数据或查询。