質問

いMySQLのテーブル座標での、列名とY僕はスワップの列値をこのテーブル、そのXとYとYがX最も明らかに解決する名前の変更に柱がないための構造が変化していない限り許可されました。

こんなことが可能なのでい 更新 ますか? 更新のテーブルセットX=Y=X 明らかにないかってきた。


編集:ご自分の制限アクセス権は、上記の防止に効果的な利用のALTER TABLEまたはその他のコマンドを変えるテーブル/データベースの構造です。名を変更したい列が追加され新しいものではありませんでます。

役に立ちましたか?

解決

これだったのと同じそもそもの私の回答をまとめ私の知見を得た。

  1. UPDATE table SET X=Y, Y=X アプローチに明らかなとんセットの両方の価値を,

  2. この方法を用いた臨時に変更します。コアントニーからのコメント http://beerpla.net/2009/02/17/swapping-column-values-in-mysql/ のための"がNULLでない場合を"調整.なので、クエリー作品unpredictably.のテーブルのスキーマの末ます。この方法はなスワップの価値観を持つ場合は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);

他のヒント

などに連れて行くことができ、和や差し引相手の価値をXとYの

UPDATE swaptest SET X=X+Y,Y=X-Y,X=X-Y;

ここではサンプル試験と作品との負の数)

mysql> use test
Database changed
mysql> drop table if exists swaptest;
Query OK, 0 rows affected (0.03 sec)

mysql> create table swaptest (X int,Y int);
Query OK, 0 rows affected (0.12 sec)

mysql> INSERT INTO swaptest VALUES (1,2),(3,4),(-5,-8),(-13,27);
Query OK, 4 rows affected (0.08 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM swaptest;
+------+------+
| X    | Y    |
+------+------+
|    1 |    2 |
|    3 |    4 |
|   -5 |   -8 |
|  -13 |   27 |
+------+------+
4 rows in set (0.00 sec)

mysql>

こちらはスワップを行ってい

mysql> UPDATE swaptest SET X=X+Y,Y=X-Y,X=X-Y;
Query OK, 4 rows affected (0.07 sec)
Rows matched: 4  Changed: 4  Warnings: 0

mysql> SELECT * FROM swaptest;
+------+------+
| X    | Y    |
+------+------+
|    2 |    1 |
|    4 |    3 |
|   -8 |   -5 |
|   27 |  -13 |
+------+------+
4 rows in set (0.00 sec)

mysql>

ぜひ試してみてください!!!

次のコードは作品全てのシナリオは私の迅速試験

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

更新のテーブルセットX=Y=X なかい(編集:PostgreSQL、MySQL、下記を参照)。に値することが、これからの行に割り当てなければなりの新しいコピーが同行し、古い行を置き換えられます。はありませんのリゾートの使用が一時テーブル、カラム、またはその他のスワップです。

@D4V360:そうなんですか。ることは衝撃的での予想外でした。使っていPostgreSQL、私の答えが正しく動作であった。を参照 PostgreSQL更新docs (パラメーター式)で記載する表現を右手にセット条項を明示的に使用の値です。そういった対応 MySQL更新docs の声明"シングル-テーブルの更新課題は一般的に評価を左右する"ことを意味している動きについて?解決方法/評価

良くなっています。

Okなので、なにができる。(仮い入れ替え文字列値)

mysql> select * from swapper;
+------+------+
| foo  | bar  |
+------+------+
| 6    | 1    | 
| 5    | 2    | 
| 4    | 3    | 
+------+------+
3 rows in set (0.00 sec)

mysql> update swapper set 
    -> foo = concat(foo, "###", bar),
    -> bar = replace(foo, concat("###", bar), ""),
    -> foo = replace(foo, concat(bar, "###"), "");

Query OK, 3 rows affected (0.00 sec)
Rows matched: 3  Changed: 3  Warnings: 0

mysql> select * from swapper;
+------+------+
| foo  | bar  |
+------+------+
| 1    | 6    | 
| 2    | 5    | 
| 3    | 4    | 
+------+------+
3 rows in set (0.00 sec)

素敵なんで濫用される左右への評価の過程イナリを使用しています。

また、使用のXORだけます。また座標ない美し整数値、または複雑な文字列?

編集:のXORも作品のようにこのように:

update swapper set foo = foo ^ bar, bar = foo ^ bar, foo = foo ^ bar;

二つの選択肢 1.利用一時テーブル 2.調査 の XORアルゴリズム

ALTER TABLE table ADD COLUMN tmp;
UPDATE table SET tmp = X;
UPDATE table SET X = Y;
UPDATE table SET Y = tmp;
ALTER TABLE table DROP COLUMN tmp;
のようなものか。

編集:約Gregコメント:ない、これは当てはまりませんの仕事:

mysql> select * from test;
+------+------+
| x    | y    |
+------+------+
|    1 |    2 |
|    3 |    4 |
+------+------+
2 rows in set (0.00 sec)

mysql>更新試験セットx=y=x;クエリー、2列の影響(0.00sec) 行合わせ:2変更:2警告:0

mysql> select * from test; +------+------+ | x | y | +------+------+ | 2 | 2 | | 4 | 4 | +------+------+ 2 rows in set (0.00 sec)

いての中間取引所変数のベストプラクティスを学などの方法:

update z set c1 = @c := c1, c1 = c2, c2 = @c

初ードを動作させることができ、常に;第二に、作品を問わずデータ型になります。

もも

update z set c1 = c1 ^ c2, c2 = c1 ^ c2, c1 = c1 ^ c2

update z set c1 = c1 + c2, c2 = c1 - c2, c1 = c1 - c2

は通常、数値データタイプの方ではお客様がご自身の責任を防ぐオーバフローを使用できませんXORの間に署名を付ける上でも使用ができないので和のために溢れる可能性はある。

update z set c1 = c2, c2 = @c where @c := c1

がうまくいきません まc1は0またはNULLまたは長さゼロの文字列です。

しに変更するには

update z set c1 = c2, c2 = @c where if((@c := c1), true, true)

こちらはスクリプト:

mysql> create table z (c1 int, c2 int)
    -> ;
Query OK, 0 rows affected (0.02 sec)

mysql> insert into z values(0, 1), (-1, 1), (pow(2, 31) - 1, pow(2, 31) - 2)
    -> ;
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from z;
+------------+------------+
| c1         | c2         |
+------------+------------+
|          0 |          1 |
|         -1 |          1 |
| 2147483647 | 2147483646 |
+------------+------------+
3 rows in set (0.02 sec)

mysql> update z set c1 = c1 ^ c2, c2 = c1 ^ c2, c1 = c1 ^ c2;
ERROR 1264 (22003): Out of range value for column 'c1' at row 2
mysql> update z set c1 = c1 + c2, c2 = c1 - c2, c1 = c1 - c2;
ERROR 1264 (22003): Out of range value for column 'c1' at row 3

mysql> select * from z;
+------------+------------+
| c1         | c2         |
+------------+------------+
|          0 |          1 |
|          1 |         -1 |
| 2147483646 | 2147483647 |
+------------+------------+
3 rows in set (0.02 sec)

mysql> update z set c1 = c2, c2 = @c where @c := c1;
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2  Changed: 2  Warnings: 0

mysql> select * from z;
+------------+------------+
| c1         | c2         |
+------------+------------+
|          0 |          1 |
|         -1 |          1 |
| 2147483647 | 2147483646 |
+------------+------------+
3 rows in set (0.00 sec)

mysql> select * from z;
+------------+------------+
| c1         | c2         |
+------------+------------+
|          1 |          0 |
|          1 |         -1 |
| 2147483646 | 2147483647 |
+------------+------------+
3 rows in set (0.00 sec)

mysql> update z set c1 = @c := c1, c1 = c2, c2 = @c;
Query OK, 3 rows affected (0.02 sec)
Rows matched: 3  Changed: 3  Warnings: 0

mysql> select * from z;
+------------+------------+
| c1         | c2         |
+------------+------------+
|          0 |          1 |
|         -1 |          1 |
| 2147483647 | 2147483646 |
+------------+------------+
3 rows in set (0.00 sec)

mysql>update z set c1 = c2, c2 = @c where if((@c := c1), true, true);
Query OK, 3 rows affected (0.02 sec)
Rows matched: 3  Changed: 3  Warnings: 0

mysql> select * from z;
+------------+------------+
| c1         | c2         |
+------------+------------+
|          1 |          0 |
|          1 |         -1 |
| 2147483646 | 2147483647 |
+------------+------------+
3 rows in set (0.00 sec)

このょう。私は必要ないのでパワーユーロSKK価格です。:)

UPDATE tbl SET X=Y, Y=@temp where @temp:=X;

上記動作しません(エラー1064(42000):きにエラーおSQL構文)

仮にご署名の整数ご列が必要になる場合があり使用CAST(a^bとして署名)の結果に関しては、オペレーターは、符号なし64ビット整数イナリを使用しています。

場合でも、こちらの方法を使ったスワップと同じカラム間の指行

SELECT BIT_XOR(foo) FROM table WHERE key = $1 OR key = $2

UPDATE table SET foo = CAST(foo ^ $3 AS SIGNED) WHERE key = $1 OR key = $2

が$1$2つの鍵の行$3の結果の最初のクエリ。

だったのですが

UPDATE tbl SET @temp=X, X=Y, Y=@temp

立場から展開させていただきます。

マーク

変更カラム名がこのhack.が慎重化の指標とするこれらのカラム

交換カラムの値を使用単一クエリ

更新my_tableセットa=@tmp:=a a=b=@tmp;

乾杯...!

ただの移動値からのカラムのその他のようなアーカイブにリセットの値のカラムです。
以下の参考の#3から受け答え、上記にしていた。

Update MyTable set X= (@temp:= X), X = 0, Y = @temp WHERE ID= 999;
CREATE TABLE Names
(
F_NAME VARCHAR(22),
L_NAME VARCHAR(22)
);

INSERT INTO Names VALUES('Ashutosh', 'Singh'),('Anshuman','Singh'),('Manu', 'Singh');

UPDATE Names N1 , Names N2 SET N1.F_NAME = N2.L_NAME , N1.L_NAME = N2.F_NAME 
WHERE N1.F_NAME = N2.F_NAME;

SELECT * FROM Names;

この例ではスワップ取引 start_dateend_date のためのデータの日の出を正しく行えるかどうかであるラウンド(時英語-日本語両方を使える大書き換え、あ 開始 日以内にその 終了 ます。下の悪いプログラマー!).

In situが、私が使っているMEDIUMINTsパフォーマンス上の理由のため(ユリウス日が0のルート1900-01-01),ったのでOKという条件の がmdu.start_date>mdu.end_date.

のPKsたすべての3つの列の個別の(運転-割り出上の理由)。

UPDATE monitor_date mdu
INNER JOIN monitor_date mdc
    ON mdu.register_id = mdc.register_id
    AND mdu.start_date = mdc.start_date
    AND mdu.end_date = mdc.end_date
SET mdu.start_date = mdu.end_date, mdu.end_date = mdc.start_date
WHERE mdu.start_date > mdu.end_date;

テーブル名でおります。 分野において、スワップ価値をb;.

更新お客様のセットa=(@温度:=a=b=@温度

こういったです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top