postgresql 限制使用upsert对不等于原始值的新值进行更新

tktrz96b  于 2023-05-17  发布在  PostgreSQL
关注(0)|答案(2)|浏览(190)

我想使用另一个表来更新一个表,而该表与我想更新的表具有相同的架构。我试图限制对与表中已有值不同的值进行更新,但我不确定此语法是否正确
示例:

CREATE TABLE your_table (
  id SERIAL PRIMARY KEY,
  column1 TEXT,
  column2 INTEGER,
  column3 FLOAT,
  unique_column TEXT UNIQUE
);

INSERT INTO your_table (column1, column2, column3, unique_column)
VALUES
  ('apple', 1, 10.5, 'apple_1'),
  ('banana', 2, 20.0, 'banana_2'),
  ('orange', 3, 30.5, 'orange_3'),
  ('apple', 4, 40.0, 'apple_4'),
  ('banana', 5, 50.5, 'banana_5'),
  ('orange', 6, 60.0, 'orange_6');

现在升级

INSERT INTO your_table (column1, column2, column3)
    SELECT value1, value2, value3
    FROM another_table
    ON CONFLICT (unique_column)
    DO UPDATE SET
        column1 = EXCLUDED.column1,
        column2 = EXCLUDED.column2,
        column3 = EXCLUDED.column3
    WHERE your_table.column1 IS DISTINCT FROM EXCLUDED.column1 
        OR your_table.column2 IS DISTINCT FROM EXCLUDED.column2 
        OR your_table.column3 IS DISTINCT FROM EXCLUDED.column3;

如果another_table的值与your_table的值不同,此打乱是否仅更新your_table(column1,column2,column3)的值?如果插入的键在(unique_column)中不匹配,则会插入特定的行,对吗?

1u4esq0p

1u4esq0p1#

如果another_table中的值与your_table中的值不同,此upset是否只更新your_table中的(column1,column2,column3)的值?
是的,如果这些列中的任何一列在your_table中具有不同的值,它将更新。
如果插入了在(unique_column)中不匹配的键,那么特定的行将被插入,对吗?
是的

ctehm74n

ctehm74n2#

,始终插入一行;你永远不会得到on conflict。您使用列unique_column作为唯一行列式,但该列未列出insert,因此始终为null。Null从不在冲突时引发匹配。参见demo here。您必须unique_column列提供适当的值:

insert into your_table (column1, column2, column3,unique_column)
    select value1, value2, value3, some_value_here 
    from another_table
    on conflict (unique_column) ...

那么@lokeshkumar的答案将是正确的。

相关问题