【问题标题】:Firebird 2.5 update or insert intoFirebird 2.5 更新或插入
【发布时间】:2018-12-05 05:19:46
【问题描述】:

我不知道如何在 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】:

    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 子句中指定重复的规则。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-10
      • 2014-07-10
      • 2022-11-13
      相关资源
      最近更新 更多