我的样品表:
+------------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+------------+------+-----+---------+-------+
| id | bigint(20) | YES | | NULL | |
| other_id | bigint(20) | YES | | NULL | |
| another_id | bigint(20) | YES | | NULL | |
+------------+------------+------+-----+---------+-------+
+------+----------+------------+
| id | other_id | another_id |
+------+----------+------------+
| 988 | 102 | NULL |
| 989 | 103 | NULL |
| 990 | 104 | NULL |
| 991 | 105 | NULL |
| 992 | 106 | NULL |
| 987 | 101 | NULL |
+------+----------+------------+
我如何在一个查询中选择和更新上表,以达到对每一行执行以下操作的作用:
UPDATE
x
SET
another_id = 987
WHERE
id = 987
AND other_id = 101;
UPDATE
x
SET
another_id = 988
WHERE
id = 988
AND other_id = 102
我不愿意为每一行运行这样的手动更新,并且希望一次完成所有操作。
答案 0 :(得分:1)
在我看来,您似乎只想将another_id
的值设置为id
:
UPDATE
x
SET
another_id = id
如果需要限制更新的行数,则可以在where子句中提供other_id
值范围:
UPDATE
x
SET
another_id = id
WHERE other_id IN (...) --list the values you want here.
答案 1 :(得分:0)
阴影在他的更新语句中是正确的。您似乎想将所有ID直接携带到ANOTHER_ID中。如果只希望在“ Other_ID”是给定范围的情况下发生这种情况,只需添加“ 101和21234之间的where other_id”或您希望它发生的任何范围。
要查看Shadow的答案将导致的结果,请将其更改为简单的SELECT语句以查看。如果正确,请更改为更新版本。例子...
Select
ID,
ID AS Another_ID,
Other_ID
from
YourTable
您将获得所有记录,其中显示两列的ID为“ Another_ID”。它不会更新“ Another_ID”列,只是查询值AS的结果列名称。同样,如果您只需要一定范围的数字,只需添加
where Other_ID between 101 and 21234
(或任何值范围)
现在,将其视为UPDATE命令与Shadow TRIED完全相同。
update YourTable set
AnotherID = ID
所有记录都将更新...如果在特定范围内...请使用与Select相同的where子句。
如果您想在不破坏生产数据的情况下尝试此操作,请使用临时的伪造表,完成后始终可以将其删除。
insert into MyTempTable
( ID,
Another_ID,
Other_ID
)
select ID, Another_ID, Other_ID
From YourTable
where ID between 500 and 800
现在您有一个测试表可与插入表一起使用,并查看其影响...