1. ホーム
  2. mysql

[解決済み] MySQLでカラムの値を入れ替える

2022-05-10 12:13:21

質問

このテーブルのカラムの値を入れ替えて、XをYに、YをXにしたいと思います。最も明白な解決策はカラム名を変更することですが、私は必ずしもそのための権限を持っていないので、構造を変更したくありません。

で行うことは可能でしょうか? アップデイト を、何らかの形で実現することは可能でしょうか? UPDATE テーブル SET X=Y, Y=X は明らかに私が望むことをしません。


編集:上記の私の権限に関する制限は、ALTER TABLEやその他のテーブル/データベース構造を変更するコマンドの使用を事実上妨げていることに注意してください。カラムの名前を変更したり、新しいカラムを追加することは残念ながらできません。

解決方法は?

ちょうど私も同じようなことがあったので、気づいたことをまとめます。

  1. その UPDATE table SET X=Y, Y=X のアプローチは明らかに機能しません。両方の値をYに設定するだけだからです。

  2. ここでは、テンポラリ変数を使った方法を紹介します。のコメントからAntonyに感謝します。 http://beerpla.net/2009/02/17/swapping-column-values-in-mysql/ は、"IS NOT NULL"の微調整のためです。これがないと、クエリが予測不可能な動きをします。投稿の最後にあるテーブルスキーマを参照してください。このメソッドは、値のいずれかがNULLの場合、値を入れ替えません。この制限のない3番目の方法を使用してください。

    UPDATE swap_test SET x=y, y=@temp WHERE (@temp:=x) IS NOT NULL;

  3. この方法は、Dipinが、またしても、コメントで提供したものです。 http://beerpla.net/2009/02/17/swapping-column-values-in-mysql/ . これは最もエレガントでクリーンなソリューションだと思います。NULLと非NULLの両方の値で動作します。

    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;

基本的に、1つ目のテーブルは更新されるもので、2つ目のテーブルは古いデータを引き出すために使用されます。

この方法では、主キーが存在することが必要であることに注意してください。

これは私のテストスキーマです。

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);