pdo在一个查询中更新多行

6 浏览
0 Comments

pdo在一个查询中更新多行

我知道你可以一次插入多行,那么在MySQL中有没有一种方法可以一次更新多行(即一次查询)?\n编辑:\n例如,我有以下内容:\n

Name   id  Col1  Col2
Row1   1    6     1
Row2   2    2     3
Row3   3    9     5
Row4   4    16    8

\n我想将所有以下更新合并为一次查询:\n

UPDATE table SET Col1 = 1 WHERE id = 1;
UPDATE table SET Col1 = 2 WHERE id = 2;
UPDATE table SET Col2 = 3 WHERE id = 3;
UPDATE table SET Col1 = 10 WHERE id = 4;
UPDATE table SET Col2 = 12 WHERE id = 4;

0
0 Comments

这个问题是关于如何在一个查询中更新多行数据的。文章中提到了一种解决方法,即使用事务来包装多个查询。接受的答案是使用INSERT ... ON DUPLICATE KEY UPDATE语句,但是需要注意它的缺点和限制。如果在插入新记录时,出现了主键在表中不存在的情况,这个查询会插入新的“半成品”记录,可能不是你想要的结果。另外,如果你的表中有一个非空字段没有默认值,并且在查询中不想操作这个字段,即使你根本没有插入任何行,你也会得到MySQL警告"Field 'fieldname' doesn't have a default value",这可能会给你带来麻烦,特别是当你决定将mysql警告转换为运行时异常时。作者进行了一些性能测试,对三种建议的变体进行了比较,包括使用INSERT ... ON DUPLICATE KEY UPDATE的变体,使用"case / when / then"子句的变体以及使用事务的简单方法。总结是,使用case语句的变体比其他两种变体快两倍,但编写正确且防注入的代码可能会很困难,所以作者个人倾向于使用最简单的方法:使用事务。文章还提到了一些读者的补充和评论,包括适用于非InnoDB类型表的解决方法,以及关于性能估计的争议。总之,使用事务是一种非常好的解决方法。

0
0 Comments

使用PDO在一次查询中更新多行数据的问题出现的原因是由于需要更新的列具有动态值。为了解决这个问题,可以使用IF或CASE语句来更新列的值。下面是一个示例代码:

UPDATE table SET Col1 = CASE id 
                          WHEN 1 THEN 1 
                          WHEN 2 THEN 2 
                          WHEN 4 THEN 10 
                          ELSE Col1 
                        END, 
                 Col2 = CASE id 
                          WHEN 3 THEN 3 
                          WHEN 4 THEN 12 
                          ELSE Col2 
                        END
             WHERE id IN (1, 2, 3, 4);

这段代码通过使用CASE语句来根据id的值更新对应的列。如果id的值匹配到了相应的条件,则更新对应的列的值,否则保持原值不变。可以看到,这种方式虽然有些繁琐,但是可以实现一次查询更新多行数据的需求。

另外,还可以在循环中使用这种解决方法。下面是一个在PHP循环中使用这种解决方法的示例代码:

$commandTxt = 'UPDATE operations SET chunk_finished = CASE id ';                   
foreach ($blockOperationChecked as $operationID => $operationChecked) {
    $commandTxt .= " WHEN $operationID THEN $operationChecked ";
}
$commandTxt .= 'ELSE id END WHERE id IN ('.implode(', ', array_keys($blockOperationChecked)).');';

这段代码使用了循环来构建更新语句,根据$blockOperationChecked数组中的键值对来更新对应的列的值。可以看到,使用CASE语句可以方便地实现动态更新多行数据的需求。

总结起来,通过使用IF或CASE语句,可以在一次查询中更新多行数据。尽管代码可能会有些繁琐,但是这种解决方法非常实用,并且可以方便地应用于动态更新数据的场景。

0
0 Comments

问题:如何在一次查询中使用pdo更新多行记录?

原因:用户想要在一次查询中更新多行记录,而不是使用多个查询来更新每一行记录。

解决方法:使用INSERT ... ON DUPLICATE KEY UPDATE语句可以实现在一次查询中更新多行记录。用户可以将要更新的数据作为参数传递给INSERT语句,并在ON DUPLICATE KEY UPDATE部分指定更新的列和更新的值。如果存在重复的主键或唯一键,则会执行更新操作,否则会执行插入操作。

示例代码如下:

INSERT INTO table (id,Col1,Col2) VALUES (1,1,1),(2,2,3),(3,9,3),(4,10,12)
ON DUPLICATE KEY UPDATE Col1=VALUES(Col1),Col2=VALUES(Col2);

需要注意的是,这个解决方法假设ID是主键或唯一键。如果有其他唯一键存在,可能会导致问题。

除了使用INSERT ... ON DUPLICATE KEY UPDATE语句外,还可以使用INSERT IGNORE和DELETE语句来实现只更新而不插入新记录的需求。用户可以在INSERT语句中添加一个在UPDATE部分中不存在的字段,并在DELETE语句中删除具有该字段值的记录,以达到只更新而不插入新记录的效果。

需要注意的是,如果有声明为NOT NULL且没有默认值的其他列存在,这些列在INSERT语句中也需要包含,但可以在UPDATE部分中忽略。

此外,还需要注意的是,如果使用自增字段,通过使用INSERT ... ON DUPLICATE KEY UPDATE语句进行更新操作时,自增字段的值仍然会增加,可能会导致自增字段溢出的问题。用户可以根据需要将自增字段的增长模式更改为classic,以避免这个问题的发生。

以上是关于如何在一次查询中使用pdo更新多行记录的原因和解决方法的整理。

0