我有一个带坐标的MySQL表,列名是X和Y.现在我想交换这个表中的列值,使X变成Y,Y变成X.最明显的解决方案是重命名列,但我不想更改结构,因为我不一定有权限这样做.

在某种程度上,这可能与更新有关吗 更新表格集X=Y,Y=X显然不能满足我的要求.


编辑:请注意,我上面提到的权限限制有效地阻止了使用ALTER TABLE或其他更改表/数据库结构的命令.不幸的是,重命名列或添加新列不是选项.

推荐答案

我不得不处理同样的问题,我将总结我的发现.

  1. UPDATE table SET X=Y, Y=X方法显然不起作用,因为它只会将两个值都设置为Y.

  2. 下面是一个使用临时变量的方法.感谢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;

  3. Dipin在http://beerpla.net/2009/02/17/swapping-column-values-in-mysql/的评论中再次提出了这种方法.我认为这是最优雅、最干净的解决方案.它同时适用于空值和非空值.

    UPDATE swap_test SET x=(@temp:=x), x = y, y = @temp;

  4. 我想出的另一种方法似乎很管用:

    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相关问答推荐

MySQL UPDATE 锁会因为连续的 SHARE 锁而饿死吗?

如何使用 IF() 条件在 MySQL 中显示真假行

如何查询打印已售罄的产品? [MYSQL]

使用 ON DUPLICATE KEY 将列增加一定数量 MySQL NodeJS

如何通过未知列中的唯一值有效地更新 MySQL 行

添加一个日期字段大于另一个日期字段的要求

是否可以从 .SQL 文件中计算表中的行数?

FreeBASIC 中的 MySQL 访问读取

无法在两个 mysql 表上执行内部联接

MYSQL_ROOT_PASSWORD 已设置但在 docker 容器中获取“用户'root'@'localhost'的访问被拒绝(使用密码:YES)”

如何检索 MySQL 数据库管理系统 (DBMS) 的当前版本?

pip install mysqlclient 返回“致命错误 C1083:无法打开文件:'mysql.h':没有这样的文件或目录

MySQL:SyntaxError:意外的标识符

Laravel mysql迁移错误

org.hibernate.InstantiationException:没有实体的默认构造函数::principal.Cliente

如何解决 mysql 警告:“InnoDB:page_cleaner:1000ms 预期循环花费了 XXX 毫秒.设置可能不是最佳的”?

Sequelize:销毁/删除表中的所有记录

如何在 localhost (xampp) 中打开/关闭 MySQL 严格模式?

NodeJS/mySQL - ER_ACCESS_DENIED_ERROR 用户'root'@'localhost'的访问被拒绝(使用密码:是)

SQLSTATE [42000]:语法错误或访问冲突:1055 SELECT 列表的表达式 #3 不在 GROUP BY 子句中并且包含非聚合