Firebird 2.5 更新或插入

问题描述 投票:0回答:1

我不知道如何在 Firebird 中编写 SQL 语句,因此它应该添加新行,并且如果满足某些条件还需要更新其他列。

示例:

(在MySql中看起来像这样:)

insert into 
table (col1, col2, col3) values ('a', 'b', 'c')
on duplicate key update col4=col3;
sql firebird insert-update firebird2.5
1个回答
10
投票

Firebird 中有两种选择

更新或插入

您可以使用

UPDATE OR INSERT

UPDATE OR INSERT INTO table (col1, col2, col3)
  VALUES ('a', 'b', 'c')
  MATCHING (col1, col2)

MATCHING
子句是可选的。如果您省略它,它将使用主键:

UPDATE OR INSERT 插入一条新记录或更新一个或多个现有记录 记录。所采取的操作取决于为 MATCHING 子句中的列(或者,如果后者不存在,则在 首要的关键)。如果找到与这些值匹配的记录,则它们 已更新。如果没有,则会插入一条新记录。

与您问题中的代码相反,这不允许您自定义更新:它将使用与插入相同的值。

如果您想要更多控制,请使用合并

合并

MERGE
语句为您提供了更多控制权,但可能会更冗长一些:

MERGE INTO table AS t
  USING (select 'a' as new1, 'b' as new2, 'c' as new3 from rdb$database) as s
    ON t.col1 = s.new1 and t.col2 = s.new2
  WHEN MATCHED THEN 
    UPDATE SET t.col4 = t.col3
  WHEN NOT MATCHED THEN 
    INSERT (col1, col2, col3) values (s.new1, s.new2, s.new3)

然而与

UPDATE OR INSERT
相反,
MERGE
不能隐式使用主键。您需要在
ON
子句中自行指定重复规则。

© www.soinside.com 2019 - 2024. All rights reserved.