gpt4 book ai didi

ruby-on-rails - 2 列表,忽略批量插入 postgresql 时的重复项

转载 作者:行者123 更新时间:2023-11-29 13:34:45 25 4
gpt4 key购买 nike

我在 Rails 中有一个 Join 表,它只是一个包含 ID 的 2 列表。

为了批量插入到这个表中,我使用

ActiveRecord::Base.connection.execute("INSERT INTO myjointable (first_id,second_id) VALUES #{values}) 

不幸的是,当存在重复项时,这会给我带来错误。我不需要更新任何值,如果存在重复项,只需继续进行下一个插入

我该怎么做?

仅供引用,我搜索了 stackoverflow,大多数答案对我来说都有些高级,无法理解。我还检查了 postgresql 文档并在 rails 控制台中试玩,但仍然无济于事。我无法弄清楚这一点,所以我希望其他人可以帮助告诉我我做错了什么。

我试过的最接近的说法是:

INSERT INTO myjointable (first_id,second_id) SELECT 1,2 
WHERE NOT EXISTS (
SELECT first_id FROM myjointable
WHERE first_id = 1 AND second_id IN (...))

此语句的部分问题是我一次只插入 1 个值,而我想要一个批量插入的语句。此外,该语句的 second_id IN (...) 部分最多可以包含 100 个不同的值,因此我不确定这会有多慢。

请注意,在大多数情况下不应该有很多重复项,所以我不确定大量插入到临时表并找到不同的值是否是个好主意。

编辑以添加上下文:

我需要批量插入的原因是因为我在 2 个模型之间存在多对多关系,其中 1 个模型从未由表单填充。我有股票和股价历史。股价历史从来没有以某种形式创建,而是通过使用雅虎金融 API 从 YahooFinance 提取数据来大量插入。我使用 activerecord-import gem 批量插入股票价格历史记录(即 Model.import 列、值),但我无法键入 jointable.import 列、值,因为我得到 jointable is an undefined local variable

最佳答案

我最终使用 WITH 子句来选择我的值并为其命名。然后我插入这些值并使用 WHERE NOT EXISTS 有效地跳过我的数据库中已经存在的任何项目。

目前看起来它正在工作...

WITH withqueryname(first_id,second_id) AS (VALUES(1,2),(3,4),(5,6)...etc) 
INSERT INTO jointablename (first_id,second_id)
SELECT * FROM withqueryname
WHERE NOT EXISTS(
SELECT first_id FROM jointablename WHERE
first_id = 1 AND
second_id IN (1,2,3,4,5,6..etc))

您可以将值与变量互换。我的是 VALUES#{values}

您还可以将 second_id IN 与变量互换。我的是 second_id IN #{variable}

关于ruby-on-rails - 2 列表,忽略批量插入 postgresql 时的重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15594601/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com