MySQL:在BEFORE INSERT触发器中执行类型转换

时间:2012-04-25 11:10:42

标签: mysql triggers insert

我有两个表,patternpattern_optimizedpattern表中的某些字段定义为BIGINT(20) DEFAULT '-1',这对于他们持有的数据来说太大了;此外,-1用作“未设置”(零是有效值) - 否则不使用其他负值。

pattern_optimized表为这些行使用新的数据格式,将其定义为INT(10) UNSIGNED DEFAULT NULL。我现在想将数据从pattern复制到pattern_optimized表。

这可以使用INSERT INTO pattern_optimized SELECT * FROM pattern轻松完成,但显然现在所有负值都超出范围,导致出现如下警告:

100 row(s) affected, 64 warning(s): 
1264 Out of range value for column 'version' at row 1 
1264 Out of range value for column 'triggered' at row 1
...
Records: 100  Duplicates: 0  Warnings: 357

我的第一个想法是创建一个BEFORE INSERT触发器,如下所示:

CREATE TRIGGER `negativeValueFix` BEFORE INSERT ON `pattern_optimized`
FOR EACH ROW
BEGIN
    IF new.version < 0 THEN 
        SET new.version = NULL; 
    END IF;
    -- ...
END

但遗憾的是,这也无济于事:弹出相同的警告,原表中的所有值-1在新表格中变为0(而不是NULL这是 - 除了在触发器中实现 - 也是行的默认值)。 似乎MySQL甚至在触发器之前转换了值。

我知道我可以使用临时表解决这个问题,但我宁愿不这样做。 pattern表格令人不快,我不想为此做一个存储过程。

还有其他方法还是我错过了一些简单的观点?

编辑:原始表中有很多列遭遇SIGNED问题,因此我希望能够自动化这一列。

2 个答案:

答案 0 :(得分:2)

你能使用案例陈述吗?类似的东西:

INSERT INTO pattern_optimized SELECT CASE version WHEN -1 THEN null ELSE version END CASE AS version FROM pattern

答案 1 :(得分:1)

只需在SELECT语句中添加一个小条件,例如 -

INSERT INTO pattern_optimized(version)
  SELECT IF(version < 0, NULL, version) version FROM pattern

...添加其他字段。