2017-11-18 55 views
0

我想要一个纯SQL查询来插入或更新多行。我开始工作之一,但是对于单排:组合更新如果不插入多行

WITH UPDATED_ITEMS as (
    UPDATE table SET (columnC, columnD) = ($value3, $value4) WHERE id = $value5 returning * 
) 
INSERT INTO table (columnA, columnB, columnC, columnD) SELECT $value1, $value2, $value3, $value4 WHERE NOT EXISTS (SELECT * FROM updated_items) 

现在我已经改变了更新条件,但不知道如何与插入做到这一点:

WITH updated_items as (
    UPDATE table as m SET 
    columnC = c.columnC 
    columnD = c.columnD 
from (values ($value3, $value4, $value5), ($value8, $value9, $value10) 
) as c(columnC, columnD, id) 
where c.id::int4 = m.id returning * 
) 
INSERT INTO table (columnA, columnB, columnC, columnD) 
SELECT ($value1, $value2, $value3, $value4, $value5), ($value6, $value7, $value8, $value9, $value10) WHERE NOT EXISTS (SELECT * FROM updated_items) 

但嵌件不起作用。任何人都请帮忙?

+0

为什么不使用'insert on conflict'来代替? –

+0

如果conficting column是一个序列号,我可以使用它吗? – mjarmoc

回答

0

我想你基本上需要not exists中的关联子句。您的更新引用了id列,所以我也添加了该列。所以我认为这是你想要的:

WITH updated_items as (
    UPDATE table as m 
    SET columnC = c.columnC, 
     columnD = c.columnD 
    FROM (VALUES ($value3, $value4, $value5), 
       ($value8, $value9, $value10) 
     ) as c(columnC, columnD, id) 
    WHERE c.id::int4 = m.id 
    RETURNING * 
    ) 
INSERT INTO table (columnA, columnB, columnC, columnD) 
    SELECT columnA, columnB, columnC, columnD 
    FROM (VALUES ($value1, $value2, $value3, $value4, $value5), 
       ($value6, $value7, $value8, $value9, $value10) 
     ) c(columnA, columnB, columnC, columnD, id) 
    WHERE NOT EXISTS (SELECT 1 FROM updated_items ui WHERE ui.id = c.id::int); 
+0

我依靠序列号创建,所以INSERT没有一个id。如果我删除最后一个$ value5,$ value10和c(id),最后是WHERE NOT EXISTS(SELECT 1 FROM updated_items);我收到一个错误'INSERT有更多的目标列比表达式') – mjarmoc

+0

@mjarmoc。 。 。 'insert'和'update'的值相同,'update'引用'id'。 –

+0

不,因为我只将4个参数插入4列。我不能INSERT ID,因为1)它是在数据库上的串行,2)如果我保存一个新的行,我没有它的ID。我发送给db的请求具有数据库ID(更新)或null(插入)上的$ value5值。 – mjarmoc

相关问题