あなたのクエリは、したがって、すべての行が更新されます、WHERE句が含まれていません。ほとんどのリレーショナルエンジンは、古い値と新しい値を維持することで機能します(この概念の詳細については、トリガーを調べてください)。作成したクエリは、ある列に格納されている古い値を別の列の新しい値に割り当てることです。
create table test (col1 int, col2 int, col3 int, col4 int, col5 int, col6 int);
insert into test values (1,2,3,4,5,6), (10,20,30,40,50,60);
commit;
select * from test;
+------+------+------+------+------+------+
| col1 | col2 | col3 | col4 | col5 | col6 |
------+------+------+------+------+------+
| 1 | 2 | 3 | 4 | 5 | 6 |
| 10 | 20 | 30 | 40 | 50 | 60 |
+------+------+------+------+------+------+
2 rows in set (0.00 sec)
update test
set Col6=Col5
, Col5=Col4
, Col4=Col3
, Col3=Col2
, Col2=Col1;
commit;
select * from test;
+------+------+------+------+------+------+
| col1 | col2 | col3 | col4 | col5 | col6 |
+------+------+------+------+------+------+
| 1 | 1 | 2 | 3 | 4 | 5 |
| 10 | 10 | 20 | 30 | 40 | 50 |
+------+------+------+------+------+------+
2 rows in set (0.00 sec)
上記のように、col6には5,5,5または4などが含まれています。 Col1は再定義されていないため、元の値を保持します。
変更された値を参照しようとするとどうなりますか?
update test
set Col1=Col2
, Col2=Col3
, Col3=Col4
, Col4=Col5
, Col5=Col6;
commit;
select * from test;
+------+------+------+------+------+------+
| col1 | col2 | col3 | col4 | col5 | col6 |
+------+------+------+------+------+------+
| 1 | 2 | 3 | 4 | 5 | 5 |
| 10 | 20 | 30 | 40 | 50 | 50 |
+------+------+------+------+------+------+
2 rows in set (0.00 sec)
ご覧のとおり、MySQLは適切な値を期待通りに列に割り当てました。新しい値が定義されていないため、Col6は更新されませんでした。
ドキュメントでは、単一テーブルの更新は順番に行われますが、複数のテーブルの更新は行われない可能性があります。 更新T1 セットt1.Col6 = t1.Col5 、t1.Col5 = t1.Col4 、t1.Col4 = t1.Col3 、t1.Col3 = t1.Col2 、T1:だから、私の更新は、以下のようなものだった場合.Col2 = t1.Col1 、t1.Col1 = t2.Col0 from [table1] t1 t2.id = t1.id これは単一のテーブル更新または複数のテーブルとみなされますか? (私はそれが単一であると仮定している) – Abhishek
@Abhishek。 。 。これは単一のテーブル構文です。しかし、その構文はMySQL構文ではなくSQL Serverの構文であることを強調する必要があります。この質問に間違いがある場合は、使用している実際のデータベースを明示的に指定する*別の質問をすることをお勧めします。 (この質問には、MySQLに基づいた4つの回答があり、データベースを変更するとそれらの回答は無効になります。) –