如何使用触发器预设列的值?我正在使用MySQL 5.5.54。
编辑。如果我删除c2上的NOT NULL约束,它似乎可以工作。
mysql> USE mydb;
Database changed
mysql> INSERT INTO t(c1) VALUES(123);
ERROR 1364 (HY000): Field 'c2' doesn't have a default value
mysql>
模式:
-- MySQL Script generated by MySQL Workbench
-- 02/21/17 08:26:27
-- Model: New Model Version: 1.0
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
-- -----------------------------------------------------
-- Schema mydb
-- -----------------------------------------------------
DROP SCHEMA IF EXISTS `mydb` ;
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
USE `mydb` ;
-- -----------------------------------------------------
-- Table `mydb`.`t`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`t` (
`c1` INT NOT NULL AUTO_INCREMENT,
`c2` INT NOT NULL,
PRIMARY KEY (`c1`))
ENGINE = InnoDB;
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
USE `mydb`;
DELIMITER $$
USE `mydb`$$
CREATE TRIGGER `t_BINS` BEFORE INSERT ON `t` FOR EACH ROW
begin
SET NEW.c2=321;
end$$
DELIMITER ;
最佳答案
这似乎是一个MySQL错误,已于2004年10月27日23:30提交,但尚未解决。参考https://dev.mysql.com/worklog/task/?id=6030。我找不到任何其他文档。
两种解决方案是删除NOT NULL
约束,或保留NOT NULL
约束并提供默认值。
此工作日志源自BUG#6295(未处理触发器
非空列)。
问题是,如果将一列声明为NOT NULL,则它不是
即使有可能执行INSERT NULL(或UPDATE到NULL)
关联的触发器,设置NOT-NULL值。
例如:
表't1'具有非空列'c1';
该表具有BEFORE INSERT触发器,该触发器设置了'c1'列
不为空值(SET NEW.c1 = 1);
插入t1值(NULL)
要么
更新t1 SET c1 = NULL
失败并显示以下错误:
错误1048(23000):列``不能为空
当前(错误)行为的原因是该列
在执行触发器之前检查约束。
这违反了标准,该标准要求列约束
在SQL语句的末尾进行检查。
关于mysql - 使用触发器预设列值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42372990/