MySQL更新所有行以增加时间戳的时间给出:“列'开始'不能为空”

时间:2017-05-11 12:53:14

标签: mysql sql

我有一个包含名为“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()

1 个答案:

答案 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;

...然后根据您找到的内容从那里开始纠正数据或查询。