ホームページ >データベース >mysql チュートリアル >テーブル構造を変更せずに MySQL で列の値を効率的に交換するにはどうすればよいですか?

テーブル構造を変更せずに MySQL で列の値を効率的に交換するにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-11 00:41:09827ブラウズ

How to Efficiently Swap Column Values in MySQL Without Changing the Table Structure?

テーブル構造を変更せずに 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: デュアル テーブル更新

もう 1 つの方法では、2 番目のテーブルを使用して値を交換します。これには、主キーが存在する必要があります:

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。