我有两张桌子,pattern
和pattern_optimized
。表中的某些字段pattern
被定义为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
表大得令人不快,我不想为此做一个存储过程。
还有其他方法还是我错过了一些简单的点?
编辑:原始表中有很多列受到签名问题的影响,所以我希望能稍微自动化一下。