在不改变表结构的情况下交换 MySQL 中的列值
正如您所提到的,使用 UPDATE 通过简单的 SET X=Y 来交换列值,Y=X 将不会产生所需的结果。但是,您可以考虑多种替代方法,具体取决于您的数据和权限限制。
方法 1:带有 IS NOT NULL 检查的临时变量
此方法采用一个临时变量,用于在与另一列交换时保存一列的值。但是,它仅在两个值都非 NULL 时才有效。
UPDATE swap_test SET x=y, y=@temp WHERE (@temp:=x) IS NOT NULL;
方法 2:不带 IS NOT NULL 检查的临时变量
一种更通用的方法,可以处理NULL 和非 NULL 值:
UPDATE swap_test SET x=(@temp:=x), x = y, y = @temp;
方法 3:双表更新
另一种方法涉及使用第二个表来交换值。这需要存在主键:
UPDATE swap_test s1, swap_test s2 SET s1.x=s1.y, s1.y=s2.x WHERE s1.id=s2.id;
测试示例
使用提供的测试架构:
CREATE TABLE `swap_test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `x` varchar(255) DEFAULT NULL, `y` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB; INSERT INTO `swap_test` VALUES ('1', 'a', '10'); INSERT INTO `swap_test` VALUES ('2', NULL, '20'); INSERT INTO `swap_test` VALUES ('3', 'c', NULL);
应用方法 2应该成功交换值:
UPDATE swap_test SET x=(@temp:=x), x = y, y = @temp;
输出:
id x y 1 10 a 2 20 NULL 3 NULL c
以上是如何在不改变表结构的情况下高效交换MySQL中的列值?的详细内容。更多信息请关注PHP中文网其他相关文章!