我正在尝试使用 activerecord-import 导入数据,但遇到了问题。如果该行已经存在,则需要更新它,否则需要创建它。表中的唯一行由两列的组合定义,其中每个列值在表中可能不是唯一的。由于这些列不是唯一的列,我将如何使用 on_duplicate_key_update 的conflict_target。
现在了解详细信息。我有一个名为 Order 的模型,下面是 Order 模型中列的简化版本。
id
order_number
sku_number
quantity
Run Code Online (Sandbox Code Playgroud)
数据库中的唯一行由 order_number 和 sku_number 的组合标识。id 列自动递增。通常,如果我有一个唯一的列作为标识符,我可以执行如下操作。因此,在下面的示例中,假设 id 列是唯一标识符,我将使用 id 列作为冲突目标。
order = Order.create(order_number: '1', sku_number: '1', quantity: 100)
order.quantity = 200
Order.import [order], on_duplicate_key_update: {conflict_target: [:id], columns: [:quantity]}
Run Code Online (Sandbox Code Playgroud)
这将更新数量,因为订单已经存在。
但我需要的是类似的东西
Order.import [order], on_duplicate_key_update: {conflict_target: [:order_number, :sku_number], columns: [:quantity]}
Run Code Online (Sandbox Code Playgroud)
其中 order_number 和 sku_number 将唯一标识冲突行。
但这会失败,因为 Postgres 期望冲突目标有一个唯一的列。
有没有办法使用非唯一列(即 order_number 和 sku_number)调用 on_duplicate_key_update ?
任何帮助将不胜感激。
我正在尝试使用循环在psql中创建一个带有日期列表的基本表.代码如下所示
DO $$
DECLARE counter INTEGER :=0;
date_interval VARCHAR(250) :='0 DAYS';
BEGIN
DROP TABLE IF EXISTS temp_dates;
CREATE TABLE temp_dates (
date DATE
);
WHILE counter < 12 LOOP
date_interval := counter || ' DAYS';
INSERT INTO temp_dates
--SELECT DATE_TRUNC('DAYS', CURRENT_DATE) - date_interval :: INTERVAL;
SELECT (DATE_TRUNC('DAYS', CURRENT_DATE)) - (INTERVAL date_interval);
counter := counter + 1;
END LOOP;
END $$;
Run Code Online (Sandbox Code Playgroud)
在上面的查询中
SELECT DATE_TRUNC('DAYS', CURRENT_DATE) - date_interval :: INTERVAL;
Run Code Online (Sandbox Code Playgroud)
作品.但以下不起作用
SELECT (DATE_TRUNC('DAYS', CURRENT_DATE)) - (INTERVAL date_interval);
Run Code Online (Sandbox Code Playgroud)
基本上唯一的区别是date_interval :: INTERVAL vs INTERVAL …