【发布时间】:2021-12-12 14:13:05
【问题描述】:
当在 UPDATE 查询中排除行时,为什么数据库引擎会首先尝试设置错误的日期时间并停止执行?
CREATE TABLE `test`(
`name` VARCHAR(255) NOT NULL,
`order_date` DATETIME NULL
)
INSERT INTO `test` (`name`, `order_date`) VALUES
("test nodate", NULL),
("test 2021-10-27", NULL);
-- Both rows are selected with a formatted date taken from the `name`
SELECT *, DATE_FORMAT(RIGHT(`name`, 10), "%Y-%m-%d") AS `date part from name` FROM `test`;
-- The first row with an invalid date in the name is correctly excluded
SELECT *, DATE_FORMAT(RIGHT(`name`, 10), "%Y-%m-%d") AS `date part from name` FROM `test`
WHERE DATE_FORMAT(RIGHT(`name`, 10), "%Y-%m-%d") IS NOT NULL;
-- Error: invalid datetime "est nodate", but that row should be excluded
UPDATE `test` SET
`order_date` = DATE_FORMAT(RIGHT(`name`, 10), "%Y-%m-%d")
WHERE DATE_FORMAT(RIGHT(`name`, 10), "%Y-%m-%d") IS NOT NULL;
DB 小提琴: https://www.db-fiddle.com/f/iUmjxZz3u5bpZesfiD4pzY/1
例如,当尝试使用此更新查询设置无效的日期时间时,引擎不会抛出相同的错误,而我希望它与上面的错误更新语句相同:
UPDATE `test`
SET `order_date` = "invalid"
WHERE `name` <> `name`;
本次更新成功,未更新任何行,但我尝试强制无效日期时间错误。
像 DATE_FORMAT() 这样的函数是执行顺序的特殊情况还是什么? 是否有可能使 UPDATE 查询成功执行?
【问题讨论】:
-
表是否有id自增?
-
@ErgestBasha 我数据库中的真实表有,小提琴中的表没有。
标签: mysql sql sql-update