我有以下问题:我试图通过创建一个预准备语句来为UPSERT语句创建一个“别名”。该语句对名为“销售”的表进行操作,该表具有列(username text、productPid integer、quantity integer、lastTimeBougth timestamp)。主键是复合键(username,productPid)。
我想让这个语句做以下事情:如果主键上没有冲突,则插入,否则,将插入中指定的数量添加到记录中指定的数量。这是我写的代码:
PREPARE upsert_sale(text, integer, integer, timestamp) AS
INSERT INTO Sale VALUES ($1, $2, $3, $4)
ON CONFLICT (username, productPid) DO UPDATE
SET quantity = quantity + $3;
然而,我得到一个错误,说最后一行中对quantity的第二个引用(从左到右阅读)是不明确的,我没有得到,因为它引用了相同的变量。我希望在这个问题上得到一些帮助。谢谢!
1条答案
按热度按时间h6my8fg21#
不明确的列异常是由
SET quantity = quantity + $3
中对quantity
的第二次引用引起的。SQL引擎无法确定该列是在sale
表中,还是在保存有冲突的建议插入行的虚拟excluded
表中。下面的代码应该可以解决不明确的列问题:
除了不明确的列标识符之外,还有一些其他问题。在没有按名称显式标识目标列的情况下,永远不要插入到表中;否则,如果目标表的列顺序发生了更改,代码就有可能中断。虽然不太可能,但还是有可能的。
如果可能,每个参数仅使用一次位置参照。这样做可以减少在添加其他参数时需要进行的更改数量,从而便于将来的代码维护。在上面的例子中,
excluded.quantity
将具有作为$3
传递的值。