在没有功能或存储过程的Amazon RedShift中进行Upsert

时间:2013-06-19 09:07:24

标签: amazon-redshift paraccel

由于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。

谢谢

1 个答案:

答案 0 :(得分:11)

您应该阅读this article on upsert by depesz。您不能依赖SERIALIABLE,因为AFAIK,ParAccel不支持完全可串行化支持,如Pg 9.1+。正如那篇文章所述,你无论如何都无法真正完成你想要的数据。

简短的版本是即使在支持可写CTE的当前PostgreSQL版本上,它仍然很难。在基于8.0的ParAccel上,你几乎没有运气。

我会进行分阶段合并。 {(1}}新数据到服务器上的临时表COPY目标表,然后执行LOCK后跟UPDATE ... FROM。以大块方式上传数据并锁定upserts的表是合理的,无论如何都要使用Redshift。

另一种方法是通过应用程序集群本地的东西来外部协调upsert。让所有工具通过外部工具进行通信,在进行插入之前,他们会采用“插入意图锁定”。您需要一个适合您系统的分布式锁定工具。如果所有内容都在一个应用程序服务器中运行,那么它可能就像同步的单例对象一样简单。