如果不存在则插入,否则在 Netezza 中更新

Posted

技术标签:

【中文标题】如果不存在则插入,否则在 Netezza 中更新【英文标题】:Insert if not exists else update it in Netezza 【发布时间】:2014-03-17 15:28:53 【问题描述】:

我在 Netezza 中使用 if not exists 语句时遇到问题。我试图先检查记录是否不存在,然后插入其他更新记录。我在 Netezza 中找不到更好的方法来做到这一点。这是我有但不起作用的:

IF NOT EXISTS(SELECT ID FROM OLD_TABLE WHERE ID NOT IN (SELECT ID FROM NEW TABLE ) )
INSERT INTO NEW_TABLE (NAME, LOCATION)
ELSE 
UPDATE NEW_TABLE
SET NAME = X.NAME
FROM (SELECT NAME, LOCATION FROM OLD_TABLE)AS X
WHERE X.NAME = NEW_TABLE.NAME

【问题讨论】:

首先检查ID,然后通过NAME 连接。而且您只想更新NAME,而不是LOCATION?请澄清。此外,您是要更新 old_table 中的所有行还是仅更新特定行?哪一个? 我想同时更新名称和位置。我只想将存在于 Old_Table 但不在 New_Table 中的 ID 插入 New_Table。我希望澄清。谢谢 是的,我想我知道你在追求什么。请相应地澄清问题。 【参考方案1】:

假设您提供了一个 ID,并希望在 new_table 中使用来自 old_table 的值对单行进行 UPSERT。我使用的是data-modifying CTE,它需要 Postgres 9.1 或更高版本:

WITH input AS (SELECT 123 AS id)
, upd AS (
   UPDATE new_table n
   SET    name = o.name
        , location = o.location
   FROM   old_table o, input i
   WHERE  n.id = o.id
   AND    n.id = i.id
   RETURNING id
   )
INSERT INTO new_table (id, name, location)
SELECT o.id, o.name, o.location
FROM   old_table o, input i 
WHERE  NOT EXISTS (SELECT 1 FROM upd)
AND    o.id = i.id;

这是一个密切相关的答案,有更多解释:Problems with a PostgreSQL upsert query

竞争条件的可能性很小。如果您打算在高并发负载下使用它,请考虑这个相关问题和更多链接:Upsert with a transaction

整张桌子

要插入整个表格:

WITH upd AS (
   UPDATE new_table n
   SET    name = o.name
        , location = o.location
   FROM   old_table o
   WHERE  n.id = o.id
   RETURNING id
   )
INSERT INTO new_table (id, name, location)
SELECT o.id, o.name, o.location
FROM   old_table o
LEFT   JOIN upd u USING (id)
WHERE  u.id IS NULL;

【讨论】:

以上是关于如果不存在则插入,否则在 Netezza 中更新的主要内容,如果未能解决你的问题,请参考以下文章

如果记录存在则插入和更新,否则不存在竞争条件

如果存在则如何更新,否则在php mysql中插入[重复]

如果存在则更新,否则插入[重复]

如果 id 存在则更新,否则插入 (ODBC)

SQL:如果存在则更新,否则插入...但对于具有不同值的多行

mysql 表中数据不存在则插入,否则更新数据