首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在亚马逊RedShift中不带函数或存储过程的Upsert

在亚马逊RedShift中不带函数或存储过程的Upsert
EN

Stack Overflow用户
提问于 2013-06-19 17:07:24
回答 1查看 4.7K关注 0票数 2

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

目前,我正在尝试使用IF...THEN...ELSE实现UPSERT机制...语句例如:-

代码语言:javascript
复制
IF NOT EXISTS(SELECT...WHERE(SELECT..))
              THEN INSERT INTO tblABC() SELECT... FROM tblXYZ
              ELSE UPDATE tblABC SET.,.,.,. FROM tblXYZ WHERE... 

这给了我一个错误。由于我是独立编写这段代码,没有将其包含在函数或SP中,所以,有没有什么解决方案可以实现UPSERT呢?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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。让您的所有工具通过外部工具进行通信,在执行插入操作之前,它们会使用“插入意图锁”。您需要一个适合您系统的分布式锁定工具。如果一切都在一个应用程序服务器中运行,那么它可能就像一个同步的单例对象一样简单。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17187251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档