小编Pra*_*ras的帖子

Activerecord-将非唯一列导入 upsert 到 postgres

我正在尝试使用 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 ?

任何帮助将不胜感激。

postgresql ruby-on-rails activerecord-import

3
推荐指数
1
解决办法
3072
查看次数

INTERVAL'0天'和'0天':: INTERVAL在postgres之间有什么区别?

我正在尝试使用循环在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 …

postgresql

2
推荐指数
1
解决办法
233
查看次数