[解決済み] MySQLでカラムの値を入れ替える
質問
このテーブルのカラムの値を入れ替えて、XをYに、YをXにしたいと思います。最も明白な解決策はカラム名を変更することですが、私は必ずしもそのための権限を持っていないので、構造を変更したくありません。
で行うことは可能でしょうか? アップデイト を、何らかの形で実現することは可能でしょうか? UPDATE テーブル SET X=Y, Y=X は明らかに私が望むことをしません。
編集:上記の私の権限に関する制限は、ALTER TABLEやその他のテーブル/データベース構造を変更するコマンドの使用を事実上妨げていることに注意してください。カラムの名前を変更したり、新しいカラムを追加することは残念ながらできません。
解決方法は?
ちょうど私も同じようなことがあったので、気づいたことをまとめます。
-
その
UPDATE table SET X=Y, Y=X
のアプローチは明らかに機能しません。両方の値をYに設定するだけだからです。 -
ここでは、テンポラリ変数を使った方法を紹介します。のコメントから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;
-
この方法は、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;
-
もう一つ、うまくいきそうな方法を思いつきました。
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);
関連
-
[解決済み] MySQLでdatetimeとtimestampのどちらのデータ型を使用すべきですか?
-
[解決済み] MySQLでコマンドラインを使用してSQLファイルをインポートするにはどうすればよいですか?
-
[解決済み] ...値に挿入する ( SELECT ... FROM ... )
-
[解決済み] MySQLのAUTO_INCREMENTをリセットする方法
-
[解決済み] ブーリアン値を格納するために使用するMySQLデータ型
-
[解決済み] MySQLデータベースの名前を素早く変更する(スキーマ名を変更する)方法は?
-
[解決済み] MySQL で特定のカラム名を持つすべてのテーブルを見つけるにはどうすればよいですか?
-
[解決済み] MySQLで重複する値を検索する
-
[解決済み] SELECT' 文の 'IF' - カラムの値に基づいて出力値を選択する
-
[解決済み】MySQLのDatetimeカラムにデフォルト値を設定する方法とは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
MySQLデータベース・インデックスの左端一致の原則
-
MySQLデータ型の詳細
-
Mysqlデータベースの手動および定期的なバックアップ手順
-
SpringBootのMySQLへの接続は、バックエンドのインターフェイスの操作方法を書き込むためのデータを取得するために
-
[解決済み] SQLエラー。ORA-01861:リテラルは、フォーマット文字列01861に一致しません。
-
MySQLの一般的な分割ライブラリおよび分割テーブルスキームの概要
-
Mysql がエラー 1241 を報告 オペランドは 1 つのカラムを含む必要があります。
-
MySQLでテーブルを削除します。親行が削除または更新できません: 外部キー制約に失敗しました。
-
Unknown character set.を解決する。MySQLデータベースインポート時の'utf8mb4'エラーの解消
-
[解決済み] MySQLテーブルへの挿入または存在する場合の更新