Insert Insert之前未在分析insert语句之前设置值

时间:2012-07-30 21:50:32

标签: mysql triggers enums 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'而@ 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吗?

1 个答案:

答案 0 :(得分:0)

我相信我发现了我的错误。

为在事务中插入/更新原始表行而创建的临时表具有与原始表相同的限制。

如果此分析准确,这意味着在我可以插入/更新表行之前,数据库管理系统将验证正在插入/更新的值并将返回上面的错误,因为我没有提供有效数据

在建立与数据库的连接之前,我必须将验证留给应用程序。