Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Mysql:全部更新还是先选择后更新?_Php_Mysql - Fatal编程技术网

Php Mysql:全部更新还是先选择后更新?

Php Mysql:全部更新还是先选择后更新?,php,mysql,Php,Mysql,我有一个表,有两列:id和count。计数为异或(同时只能有一个计数为1)。我需要更新计数为1的行,并且需要将以前的计数1设置为0 我认为有两种策略: 1) 在表上进行选择,找到1处的行。 在0更新它。 更新我希望位于1的行 2) 全局更新计数为0的表。 更新我希望位于1的行 在第一种情况下,我进行3次查询,但“很小”。 在第二种情况下,我做了两个查询,但其中一个是“big” 哪种策略更好?如果只需交换两行上的值,则可以在单个查询中完成 例如 使用自联接进行更新: update myTable

我有一个表,有两列:id和count。计数为异或(同时只能有一个计数为1)。我需要更新计数为1的行,并且需要将以前的计数1设置为0

我认为有两种策略:

1) 在表上进行选择,找到1处的行。 在0更新它。 更新我希望位于1的行

2) 全局更新计数为0的表。 更新我希望位于1的行

在第一种情况下,我进行3次查询,但“很小”。 在第二种情况下,我做了两个查询,但其中一个是“big”


哪种策略更好?

如果只需交换两行上的值,则可以在单个查询中完成

例如

使用自联接进行更新:

update myTable a, myTable b set
    a.`count` = b.`count`,
    b.`count` = a.`count`
where a.id = '2'
and b.id = '3'
结果是:

+----+-------+
| id | count |
+----+-------+
| 1  | 0     |
| 2  | 1     |
| 3  | 0     |
+----+-------+
如果您想针对特定的行,也可以这样做。 例如,id为1的行的计数应为1,当前计数为1的任何行都应重置回0

update myTable a, myTable b set
    a.`count` = 1,
    b.`count` = 0
where a.id = '1'
and b.`count` = '1'

我想,无论什么事情,总的来说都需要更少的时间。在这两种情况下,您都在进行两次更新,但在第一次更新中有一个额外的选择。因此,只要看看这是否会改变所用的时间。您可以将策略的两个步骤(1)组合为一个步骤:“在表上进行选择,在1处找到行。在0处更新它”。我总是在发布之前进行测试:)最后一个示例正是我要查找的。我不记得我可以在同一张桌子上打两次电话。TNX
update myTable a, myTable b set
    a.`count` = 1,
    b.`count` = 0
where a.id = '1'
and b.`count` = '1'