我有两个表,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
表格令人不快,我不想为此做一个存储过程。
还有其他方法还是我错过了一些简单的观点?
编辑:原始表中有很多列遭遇SIGNED问题,因此我希望能够自动化这一列。
答案 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
...添加其他字段。