在将一行插入表格之前,我想要运行一个触发器:
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'而@ action2是'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语句,则会收到以下错误:
insert into t1(idt1, myType) values (1, 'F');
- > ERROR 1265(01000):第1行的“myType”列截断数据
insert into t1(idt1, myType) values (1, null);
- >错误1048(23000):列'myType'不能为空
触发器是否应该将新值强制转换为NEW.myType字段,而insert语句是否继续使用正确的值?在这种情况下,两个示例都应在表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
吗?
答案 0 :(得分:0)
我相信我发现了我的错误。
为在事务中插入/更新原始表行而创建的临时表具有与原始表相同的限制。
如果此分析准确,这意味着在我可以插入/更新表行之前,数据库管理系统将验证正在插入/更新的值并将返回上面的错误,因为我没有提供有效数据
在建立与数据库的连接之前,我必须将验证留给应用程序。