如何用一次更新来更新mysql中的2行



如何使用一个查询进行更新?我想做这样的事情:

update customer 
set balance = (400,150)  where customer_id IN ('2','3');

客户2将获得400的新余额,而客户3将获得150。

我想要一个查询,因为我使用的是spring-boot,JPA-

@Modifying
@Query("update customer set balance = (400,150)  where customer_id IN ('2','3');")

我可以在这里做两个查询吗?每个客户?推荐什么?什么是可以接受的?

谢谢。

你可以通过这种方式-

Update customer
SET balance = (case when customer_id = '2' then '400'
when customer_id = '3' then '150'
end)
WHERE
customer_id IN ('2','3');

CASE语句可能就是您想要的。


UPDATE customer
SET balance = (case
when customer_id = 1 then 150
when customer_id = 2 then 300
end)        
WHERE ID in (1,2);

如果customer_id的类型为字符串,请在customer_id编号中添加引号。

我的例子只是的一个修改版本


Example Code:
UPDATE students
SET JavaScore = (case
when ID = 1 then 75
when ID = 2 then 80
when ID = 3 then 86
when ID = 4 then 55
end),
PythonScore = (case
when ID = 1 then 70
when ID = 2 then 85
when ID = 3 then 94
when ID = 4 then 75
end)
WHERE ID in (1,2,3,4);

来自本网站:

DelftStack

Hibernate可以为您做到这一点,而无需编写自己的查询。

步骤。

  1. hibernate.jdbc.batch_size设置为某个合理的大小
  2. 启用插入/更新查询排序
  3. 为MySQL启用语句重写(将rewriteBatchedStatements设置为true(

在application.properties中添加以下

spring.jpa.properties.hibernate.jdbc.batch_size=50
spring.jpa.properties.hibernate.order_inserts=true
spring.jpa.properties.hibernate.order_updates=true
# spring.jpa.properties.hibernate.jdbc.batch_versioned_data=true # Needed when using versioned data
spring.datasource.hikari.dataSourcePoperties.rewriteBatchedStatements=true

另请参阅此和此了解更多背景信息。

现在,在您的代码中,您只需更新和保存客户,数据库将只收到1个查询。

如果您想使用spring数据方式,您必须尽可能少地使用复杂的SQL/JQL。

@Entity
class CustomerEntity {
}
@Modifying
@Query("update CustomerEntity customer set customer.balance = :balance where customer.id = :customerId")
int updateCustomerBalance(@Param("customerId") String customerId, @Param("balance") String balance);
customerRepository.updateCustomerBalance("2", "400");
customerRepository.updateCustomerBalance("3", "150");

常见交易

如果你想更新发生在一个交易

@Transactional
void doUpdate() {
customerRepository.updateCustomerBalance("2", "400");
customerRepository.updateCustomerBalance("3", "150");
}

请记住,您必须从外部呼叫service.doUpdate()。如果从另一个服务方法调用该方法,则不会创建事务。

检查是否发生了更新

int count = customerRepository.updateCustomerBalance("2", "400");
if (count == 0) {
log.error("Customer not updated customerId=2 customerBalance=400");
}

相关内容

  • 没有找到相关文章

最新更新