如何使用触发器预设列的值?我正在使用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/

10-11 22:27
查看更多