【问题标题】:Incrementing a column value in a SQL database if there is a duplicate row如果存在重复行,则增加 SQL 数据库中的列值
【发布时间】:2018-10-22 13:17:25
【问题描述】:

假设我有这样一张桌子:

Number   Product    Type
 1        Meat      Cow
 1        Milk       A

如果我插入一个新行:

INSERT INTO t1 (Product, Type) VALUES (Meat, Cow)

我不想要新行。我希望 Product = Meat 和 Type = Cow 的列“数字”增加 1:

Number   Product    Type
 2        Meat      Cow
 1        Milk       A

有执行此操作的 SQL 命令吗?

【问题讨论】:

  • 如果您对(Product, Type) 有唯一约束,您可以使用insert on conflict do update ...

标签: sql postgresql insert sql-update


【解决方案1】:

您可以使用从版本9.5 开始的ON CONFLICT 尝试以下操作:

create table t1( Number int, 
                 Product varchar(15), 
                 Type varchar(15),
                 primary key (Product, Type)
               );

insert into t1(Number,Product,Type) values(1,'Meat','Cow');               

insert into t1(Number,Product,Type) values(1,'Meat','Cow')
on conflict (Product,Type) do update set Number = t1.Number + 1;
select * from t1;  

number  product type
------  ------- ----
  2      Meat   Cow

Rextester Demo

其中,对于 ProductType 列,复合唯一(主)键是必须的,如果不存在,则比 42P10:没有匹配 ON CONFLICT 规范的唯一或排除约束错误引发.

【讨论】:

  • 工作就像一个魅力!谢谢。
【解决方案2】:

您可以使用触发器来实现您想要的。格式:

CREATE OR REPLACE TRIGGER trigger_name
INSTEAD OF INSERT ON table_name
WHEN (your_condition_here) --for example, row exist 
BEGIN 
    UPDATE ... --your update query
END;

【讨论】:

  • instead of 触发器只能在视图上定义,不能在表上。
【解决方案3】:

在产品和类型上创建唯一索引,然后

INSERT INTO t1 (Product, Type) VALUES (Meat, Cow) 
ON CONFLICT ON CONSTRAINT <your_key> 
UPDATE set Number = Number + 1

应该可以。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-26
    • 2012-02-14
    • 2022-01-22
    • 2023-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多