问题: 我最近将 MySQL 数据库从版本 5.7 迁移到 8.0.3,并且在更新查询期间遇到了空约束违规问题。数据库在严格模式关闭的情况下运行。
背景: 我有一个插入查询,该查询插入的数据由于缺少必填字段而带有警告。我收到的警告是“错误代码:1364 字段‘callback_received’没有默认值。”这是预期的,因为数据库没有在严格模式下运行,所以它允许插入数据,即使是 NULL。
桌子
CREATE TABLE `order` (
`order_id` INT NOT NULL AUTO_INCREMENT,
`order_code` VARCHAR(255) DEFAULT NULL
`member_id` INT DEFAULT NULL,
`order_date` TIMESTAMP NULL,
`callback_received` INT DEFAULT NOT NULL COMMENT '1 - Yes 2 - No'
PRIMARY KEY (`order_id`),
KEY `index_OrderCode` (`order_code`),
KEY `index_MemberID` (`member_id`)
) ENGINE = INNODB AUTO_INCREMENT = 1 DEFAULT CHARSET = latin1
插入
INSERT INTO `order`(order_code,member_id,order_date) VALUES ('ORDCODE001',1000,NOW());
更新
UPDATE `order`
SET `callback_received` WHERE order_code = '05917A89'
触发 有一个触发器 (order_generate_unique_code) 可设置唯一的订单代码。
CREATE TRIGGER `order_generate_unique_code` BEFORE INSERT ON `order` FOR EACH ROW BEGIN SET new.order_code = get_unique_code(); END; $$ -- get_unique_code function having simple logic to generate unique string.
问题: 尽管在更新语句中为“callback_received”提供了一个值,但我在执行过程中遇到了空约束错误:
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'callback_received' cannot be null
我很欣赏任何关于更新过程中为什么会发生这种空约束冲突的见解,尤其是在迁移到 MySQL 8.0.3 之后。
在 MySQL 8.0.3 中,严格模式下默认包含 no_auto_value_on_zero 。 所以你需要修复更新集部分。 SET
callback_received
= 1 可能会修复它