使用触发器预设列值

时间:2017-02-21 16:36:11

标签: mysql triggers

如何使用触发器预设列的值?我使用的是MySQL 5.5.54。

EDIT。如果我删除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 ;

1 个答案:

答案 0 :(得分:0)

这似乎是2004年10月27日23:30提交的MySQL错误,但尚未解决。参考https://dev.mysql.com/worklog/task/?id=6030。我找不到任何其他文件。

两个解决方案是删除NOT NULL约束,或保留NOT NULL约束并提供默认值。

  

此WorkLog起源于BUG#6295(触发器未处理   NOT NULL COLUMNS)。

     

问题是如果列声明为NOT NULL,则不是   可能做INSERT NULL(或UPDATE为NULL),即使有   关联触发器,设置NOT-NULL值。

     

例如:

     
      
  • 表' t1'使用NOT NULL列' c1';

  •   
  • 该表具有BEFORE INSERT触发器,用于设置' c1'柱   不为空值(SET NEW.c1 = 1);

  •   
  • INSERT INTO t1 VALUES(NULL)   要么   更新t1 SET c1 = NULL   失败,出现以下错误:   ERROR 1048(23000):专栏''不能为空

  •   
     

当前(错误)行为的原因是该列   在执行触发器之前检查约束。

     

这违反了标准,它要求列约束   在SQL语句结束时检查。