由于 RedShift 不支持用户定义的函数或存储过程,我如何在使用 ParAccel(PostgreSQL 8.0.2 分支)的 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。
谢谢
最佳答案
您可能应该阅读 this article on upsert by depesz .你不能依赖 SERIALIABLE
为此,据我所知,ParAccel 不支持像 Pg 9.1+ 中那样的完整可序列化支持。正如那篇文章中所概述的那样,无论如何,您不能真正完全在数据库中做您想做的事。
简短的版本是,即使在当前支持可写 CTE 的 PostgreSQL 版本上,它仍然很难。在基于 8.0 的 ParAccel 上,您几乎不走运。
我会进行分阶段合并。 COPY
新数据到服务器上的临时表,LOCK
目标表,然后执行 UPDATE ... FROM
接着是 INSERT INTO ... SELECT
.以大块的方式上传数据并为更新插入锁定表,这与 Redshift 的使用方式保持一致。
另一种方法是通过您的应用程序集群本地的某些东西从外部协调更新插入。让您的所有工具通过外部工具进行通信,在执行插入之前,它们会在其中进行“插入意图锁定”。您需要适合您系统的分布式锁定工具。如果一切都在一个应用程序服务器中运行,它可能就像一个同步的单例对象一样简单。
关于amazon-redshift - 在没有函数或存储过程的情况下在 Amazon RedShift 中更新插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17187251/