2

由于 RedShift 中不支持用户定义的函数或存储过程,我如何UPSERT在使用 ParAccel(PostgreSQL 8.0.2 fork)的 RedShift 中实现机制。

目前,我正在尝试使用 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。

谢谢

4

1 回答 1

11

您可能应该阅读depesz 关于 upsert 的这篇文章。你不能依赖SERIALIABLE这一点,因为 AFAIK,ParAccel 不支持 Pg 9.1+ 中的完全可串行化支持。正如那篇文章中所述,无论如何,你不能真正在数据库中做你想做的事。

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

我会进行分阶段合并。COPY新数据到服务器上的临时表,LOCK即目标表,然后执行 anUPDATE ... FROM后跟INSERT INTO ... SELECT. 以大块的形式上传数据并为 upserts 锁定表是合理地与 Redshift 的使用方式保持一致。

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

于 2013-06-20T03:33:34.277 回答