0

我有两张桌子,patternpattern_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表大得令人不快,我不想为此做一个存储过程。

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

编辑:原始表中有很多列受到签名问题的影响,所以我希望能稍微自动化一下。

4

2 回答 2

2

你能用case语句吗?就像是:

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

于 2012-04-25T11:15:35.260 回答
1

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

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

...添加其他字段。

于 2012-04-25T11:17:14.340 回答