如果不存在则插入,否则在 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 中更新的主要内容,如果未能解决你的问题,请参考以下文章