sql - Firebird 2.5 更新或插入
问题描述
我不知道如何在 Firebird 中编写 SQL 语句,因此它应该添加新行,并且如果某些条件满足更新其他列。
例子:
(在 MySql 中看起来像这样:)
insert into
table (col1, col2, col3) values ('a', 'b', 'c')
on duplicate key update col4=col3;
解决方案
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
子句中指定重复的规则。
推荐阅读
- android-studio - Android Studio 中的 Flutter 集成测试运行/调试配置
- c++ - 使命令不产生可执行文件
- react-native - 获取嵌套数据,未定义不是对象
- c# - 如何引用抽象类
- ruby-on-rails - 当 Parameter 包含非法值时,是否存在类似于 ActionController::UnpermittedParameters 的已定义异常?
- javascript - 用第二个数组中的名称替换数组中的 id
- asp.net-web-api - Web Api 控制器未解析操作
- python - 从范围生成python字典理解
- sql-server - 父子层次结构计数
- javascript - 画布根本不下载