mysql多个更新和插入查询一次

10 浏览
0 Comments

mysql多个更新和插入查询一次

我知道你可以一次插入多行,那么在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

问题的出现原因是:在MySQL中,当需要一次性更新或插入多个记录时,有多种方法可供选择。然而,有些方法存在一些缺点和限制。例如,使用INSERT ... ON DUPLICATE KEY UPDATE语句时,如果插入的记录的主键在表中不存在,那么这条语句将会插入新的“不完整”记录,这可能不是我们想要的结果。另外,如果表中有一个非空字段且没有默认值,并且在查询中不想对该字段进行操作,即使你根本没有插入任何记录,MySQL也会产生"Field 'fieldname' doesn't have a default value"的警告,这可能会给你带来麻烦。

解决方法是:将多个查询语句包装在一个事务中。这是最简单的方法。使用事务可以确保所有的查询要么都成功执行,要么都不执行。这样可以避免上述问题的出现。

作者还进行了对几种推荐的方法进行了性能测试,包括使用INSERT ... ON DUPLICATE KEY UPDATE语句、使用"case / when / then"语句和使用事务的方法。测试结果显示,使用case语句的方法比其他两种方法快两倍,但编写正确且安全的代码可能比较困难。因此,作者个人倾向于使用最简单的方法:使用事务。

至于不使用InnoDB类型的表如何使用事务,以及使用case语句的注入安全代码的链接或示例代码,读者可以在帖子中寻找相关信息。

另外,该帖子还提到了有关性能的一些不准确的信息,并提供了一个链接以获取更详细的研究结果。

总之,通过使用事务可以解决一次性更新或插入多个记录的问题,并避免其他方法可能存在的缺点和限制。

0
0 Comments

问题出现的原因是因为需要一次性执行多个更新和插入查询操作。解决方法是使用IF或CASE语句来更新列的值。下面是一个示例代码,演示如何使用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);

虽然这种动态更新的写法可能不太美观,但是功能上是可行的。实际上,这种方式也适用于动态更新。例如,在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 )).');';

0
0 Comments

在MySQL中,可以使用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和计数,而不会插入其他信息。只有在存在ID的条目时,才会执行更新操作;否则,将跳过该记录。

为了解决这个问题,可以使用INSERT IGNORE和ON DUPLICATE KEY UPDATE结合使用。但是,INSERT IGNORE仍然会插入非重复记录,这并不符合要求。

一个解决方案是在插入部分中添加一个在更新部分中不存在的字段,并在删除所有具有该字段值的记录之后执行操作。示例如下:

insert into tbl (id, title, workaround) values ('realId','realTitle','This row must die!') on duplicate key update id=values(id), title=values(title);
delete from tbl where workaround = 'This row must die!';

另一个需要注意的地方是,如果有其他声明为NOT NULL但没有默认值的列,那么在插入操作中必须将其包含进去。但在更新操作中可以忽略这些列,可以使用虚拟值。

还有一个问题是自增字段的增加,即使没有插入新记录,使用ON DUPLICATE KEY UPDATE仍然会增加自增值。如果经常使用这种方式进行更新操作,自增字段可能会很快溢出。可以通过将自增模式更改为classic来防止自增字段的增加。

使用INSERT ... ON DUPLICATE KEY UPDATE语句可以实现在MySQL中一次执行多个更新和插入操作的需求。可以通过结合使用INSERT IGNORE和ON DUPLICATE KEY UPDATE来解决只更新而不插入新记录的问题,同时需要注意自增字段的增加和其他列的处理。

0