我有我想要运行之前插入一行到表中的触发器:之前插入触发器不设置值分析insert语句之前
CREATE TABLE IF NOT EXISTS `test`.`t1`(
`idt1` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`myType` ENUM('A','B','C') NOT NULL DEFAULT 'A',
PRIMARY KEY (`idt1`))
ENGINE = InnoDB;
delimiter $$
CREATE TRIGGER mtCheck BEFORE INSERT ON t1
FOR EACH ROW
BEGIN
set @action = NEW.myType;
IF (NEW.myType NOT LIKE 'B') THEN
SET New.myType = 'C';
END IF;
set @action2 = NEW.myType;
END $$
delimiter ;
如果我运行下面的代码,因为“A '是EMUN一个有效的值,则@action是‘A’和@动作2是‘C’:
set @action = 'no action';
set @action2 = 'no action';
select @action, @action2;
start transaction;
insert into t1(idt1, myType) values (1, 'A');
select @action, @action2;
select * from t1;
rollback;
select * from t1;
select @action, @action2;
如果我改变插入语句的以下示例之一,我收到以下错误:
insert into t1(idt1, myType) values (1, 'F');
- >错误1265(01000):数据被截断为列 '的myType' 在第1行
insert into t1(idt1, myType) values (1, null);
- >错误1048(23000):柱 '的myType' 不能为空
不应该触发强制新值到NEW.myType字段和插入语句继续使用正确的值?在这种情况下,两个示例应该在表t1的myType字段中输入值“C”。
它与我的sql_mode有什么关系吗?
SELECT @@GLOBAL.sql_mode;
- > STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
SELECT @@SESSION.sql_mode;
- > STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
我应该将其更改为STRICT_ALL_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
?