由于RedShift中不支持用户定义函数或存储过程,如何在使用PostgreSQL 8.0.2分支ParAccel的RedShift中实现UPSERT机制。
目前,我正在尝试使用IF...THEN...ELSE实现UPSERT机制...语句例如:-
IF NOT EXISTS(SELECT...WHERE(SELECT..))
THEN INSERT INTO tblABC() SELECT... FROM tblXYZ
ELSE UPDATE tblABC SET.,.,.,. FROM tblXYZ WHERE... 这给了我一个错误。由于我是独立编写这段代码,没有将其包含在函数或SP中,所以,有没有什么解决方案可以实现UPSERT呢?
谢谢
发布于 2013-06-20 11:33:34
你可能应该读一读this article on upsert by depesz。你不能依赖SERIALIABLE,因为AFAIK,ParAccel不像Pg 9.1+那样支持完整的序列化支持。正如那篇文章中所概述的,你不能完全在数据库中做你想做的事情。
简而言之,即使在当前支持可写CTE的PostgreSQL版本上,仍然很难做到。在基于8.0的ParAccel上,你很不走运。
我会做一个分阶段的合并。将新数据COPY到服务器上的临时表,对目标表执行LOCK,然后执行UPDATE ... FROM,然后执行INSERT INTO ... SELECT。在大块中进行数据上传,并为upserts锁定表,这与Redshift的使用方式是合理的。
另一种方法是通过应用程序集群的本地功能在外部协调upserts。让您的所有工具通过外部工具进行通信,在执行插入操作之前,它们会使用“插入意图锁”。您需要一个适合您系统的分布式锁定工具。如果一切都在一个应用程序服务器中运行,那么它可能就像一个同步的单例对象一样简单。
https://stackoverflow.com/questions/17187251
复制相似问题