【发布时间】:2021-03-23 16:58:08
【问题描述】:
我正在尝试在 Firebird 2.5 中创建一个 SQL 语句,以便通过在记录存在时添加到整数来更新整数数量,或者只是插入一个新行。我似乎无法找到关于添加某个数量(如果已经存在)的具体问题的真正答案。
我能想到的SQL如下:
UPDATE OR INSERT INTO Pencils(Number, Location, Quantity)
VALUES('12345678/90', 'TOP', 20)
MATCHING(Number, Location);
所以如果有匹配的记录,我想在实际 20 数量的基础上增加一定数量。
就像我对UPDATE 声明所做的那样:
UPDATE Pencils SET Quantity = Quantity + 20 WHERE Number = '12345678/90'
是否有可能使用UPDATE OR INSERT 语句实现这样的结果,还是有其他方法?
.
.
编辑: 使用 IBExpert / Delphi 使用参数查询的解决方案
MERGE INTO Pencils AS Dest
USING (SELECT CAST(:myNumb as varchar(30)) AS Number,
CAST(:myLoca as varchar(10)) AS Location,
CAST(:myQuan as integer) AS Quantity
FROM RDB$DATABASE) Src
ON (Dest.Number = Src.Number AND Dest.Location = Src.Location)
WHEN MATCHED THEN
UPDATE SET Dest.Quantity = Dest.Quantity + Src.Quantity
WHEN NOT MATCHED THEN
INSERT (Number, Location, Quantity) VALUES (Src.Number, Src.Location, Src.Quantity);
【问题讨论】:
-
对于完全怪胎来说,还有另一种古老的方法可以做到这一点,它早于 MERGE、U-O-I 甚至 Firebird 本身。它需要创建可更新视图,其中U/I/D 操作由
triggers中的PSQL 代码实现,然后Before Insert触发器将检查基础表中是否已经存在行。但这将是这样一台 Rube Goldberg 机器......像 Delphi XE2 中的 NormalizeRect 一样可爱迷人:-D
标签: sql firebird firebird2.5