在单个查询postgresql 9.6中插入记录和更新计数

时间:2018-04-23 09:42:47

标签: ruby-on-rails postgresql bulkinsert insert-update

我有两张表usersproducts。我在一个查询中插入了20,000条记录,但我又要将products_count表中的users属性中的产品计数保存到同一个事务中。此外,如果用户有任何产品删除,则还需要更新计数。

这就是我一次插入20k记录的方式:

product_ids.each { |product_id| attrs << "('#{product_id}','#{user_id}','#{Time.now.utc}')" }
products_sql = "INSERT INTO products(product_id, user_id, created_at) VALUES #{attrs.join(', ')}"
ActiveRecord::Base.connection.execute(products_sql)

这种情况已成功发生。但是,如果可能的话,如何使用相同的查询将计数更新为用户表?

一种方法是我只使用Rails更新方法来更新计数。

2 个答案:

答案 0 :(得分:0)

在更新结束时,您可以执行查询以重新计算产品数量。像

这样的东西
update
  users
set
  users.product_count=(select count(products.id) from products where products.user_id=users.id)

答案 1 :(得分:0)

我知道你想在相同的查询中使用它,但下面可能会完成你想要的。在初始插入后使用此

product_ids.each { |product_id| attrs << "('#{product_id}',' {user_id}','#{Time.now.utc}')" }
products_sql = "INSERT INTO products(product_id, user_id, created_at) VALUES #{attrs.join(', ')}"
ActiveRecord::Base.connection.execute(products_sql)

product_count = product_ids.size
users_sql = "INSERT INTO users(product_count) VALUES #{product_count}"
ActiveRecord::Base.connection.execute(users_sql)