[英] Swapping column values in MySQL
我有一个带坐标的MySQL表,列名是X和Y.现在我想交换这个表中的列值,使X变成Y,Y变成X.最明显的解决方案是重命名列,但我不想更改结构,因为我不一定有权限这样做.
在某种程度上,这可能与更新有关吗 更新表格集X=Y,Y=X显然不能满足我的要求.
编辑:请注意,我上面提到的权限限制有效地阻止了使用ALTER TABLE或其他更改表/数据库结构的命令.不幸的是,重命名列或添加新列不是选项.
我有一个带坐标的MySQL表,列名是X和Y.现在我想交换这个表中的列值,使X变成Y,Y变成X.最明显的解决方案是重命名列,但我不想更改结构,因为我不一定有权限这样做.
在某种程度上,这可能与更新有关吗 更新表格集X=Y,Y=X显然不能满足我的要求.
编辑:请注意,我上面提到的权限限制有效地阻止了使用ALTER TABLE或其他更改表/数据库结构的命令.不幸的是,重命名列或添加新列不是选项.
我不得不处理同样的问题,我将总结我的发现.
UPDATE table SET X=Y, Y=X
方法显然不起作用,因为它只会将两个值都设置为Y.
下面是一个使用临时变量的方法.感谢Antony对"IS NOT NULL"调整的http://beerpla.net/2009/02/17/swapping-column-values-in-mysql/条评论.没有它,查询就无法预测.请参阅本文末尾的表格模式.如果其中一个值为NULL,则此方法不会交换这些值.使用没有这个限制的方法#3.
UPDATE swap_test SET x=y, [email protected] WHERE (@temp:=x) IS NOT NULL;
Dipin在http://beerpla.net/2009/02/17/swapping-column-values-in-mysql/的评论中再次提出了这种方法.我认为这是最优雅、最干净的解决方案.它同时适用于空值和非空值.
UPDATE swap_test SET x=(@temp:=x), x = y, y = @temp;
我想出的另一种方法似乎很管用:
UPDATE swap_test s1, swap_test s2 SET s1.x=s1.y, s1.y=s2.x WHERE s1.id=s2.id;
Essentially, the 1st table is the one getting updated and the 2nd one is used to pull the old data from.
Note that this approach requires a primary key to be present.
这是我的测试模式:
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);
MySQL UPDATE 锁会因为连续的 SHARE 锁而饿死吗?
使用 ON DUPLICATE KEY 将列增加一定数量 MySQL NodeJS
MYSQL_ROOT_PASSWORD 已设置但在 docker 容器中获取“用户'root'@'localhost'的访问被拒绝(使用密码:YES)”
如何检索 MySQL 数据库管理系统 (DBMS) 的当前版本?
pip install mysqlclient 返回“致命错误 C1083:无法打开文件:'mysql.h':没有这样的文件或目录
org.hibernate.InstantiationException:没有实体的默认构造函数::principal.Cliente
如何解决 mysql 警告:“InnoDB:page_cleaner:1000ms 预期循环花费了 XXX 毫秒.设置可能不是最佳的”?
如何在 localhost (xampp) 中打开/关闭 MySQL 严格模式?
NodeJS/mySQL - ER_ACCESS_DENIED_ERROR 用户'root'@'localhost'的访问被拒绝(使用密码:是)
SQLSTATE [42000]:语法错误或访问冲突:1055 SELECT 列表的表达式 #3 不在 GROUP BY 子句中并且包含非聚合