如何使用触发器预设列的值?我使用的是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 ;
答案 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语句结束时检查。