gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 06:08:31 25 4
gpt4 key购买 nike

我有两个表,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 问题,因此我希望能够在某种程度上实现自动化。

最佳答案

你能使用案例陈述吗?像这样的东西:


插入pattern_optimized
选择
案例版本
当 -1 时则为空
其他版本
END CASE AS 版本
FROM模式

关于MySQL:在 BEFORE INSERT 触发器中执行类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10314420/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com