Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 当使用EXCEPT set操作符时,如何编写Postgres SELECT以进行更新?_Postgresql_Select_Locking - Fatal编程技术网

Postgresql 当使用EXCEPT set操作符时,如何编写Postgres SELECT以进行更新?

Postgresql 当使用EXCEPT set操作符时,如何编写Postgres SELECT以进行更新?,postgresql,select,locking,Postgresql,Select,Locking,在Postgres(11,如果有必要的话)中,我需要做一个选择更新,以获得一组行,我随后将对这些行进行一些更改,并且在进行这些更改时,我不希望事务之外的任何人干扰这些行 但是,我要锁定的行集合实际上是由集合差定义的,即 SELECT <columns> FROM table1 t1 JOIN table2 t2 ON ... WHERE ... EXCEPT SELECT <columns> FROM table1 t1 JOIN table3 t3 ON ... WHE

在Postgres(11,如果有必要的话)中,我需要做一个
选择更新
,以获得一组行,我随后将对这些行进行一些更改,并且在进行这些更改时,我不希望事务之外的任何人干扰这些行

但是,我要锁定的行集合实际上是由集合差定义的,即

SELECT <columns> FROM table1 t1 JOIN table2 t2 ON ... WHERE ...
EXCEPT
SELECT <columns> FROM table1 t1 JOIN table3 t3 ON ... WHERE ...
但我也不确定这是否给了我想要的,即使它在语法上是可以接受的


如果我对(Postgres)select语句的解析树的形状有一个想法,我自己就可以很容易地解决这个问题;但事实上,我现在有点不知所措。

您不能将
联合
相交
之外的其他项一起用于更新
,因为这在一般情况下可能会导致歧义

我可以想出两种方法:

  • 使用
    存在
    不存在

    SELECT ... FROM table1
    WHERE EXISTS (SELECT 1 FROM table2 ...
                  WHERE table2.x = table1.x AND ...)
      AND NOT EXISTS (SELECT 1 FROM table3 ...
                      WHERE table3.y = table1.y AND ...)
    FOR UPDATE OF table1;
    
  • 使用子查询:

    SELECT ... FROM table1
    WHERE id IN (SELECT t1.id
                 FROM table1 t1 JOIN table2 t2 ON ...
                 WHERE ...
                 EXCEPT
                 SELECT t1.id
                 FROM table1 t1 JOIN table3 t3 ON ...
                 WHERE ...)
    FOR UPDATE OF table1;
    

  • 啊,事实上,现在我看到了,在“当前,对于无键更新,对于更新,对于共享和对于键共享,不能为EXCEPT结果或EXCEPT的任何输入指定。”一节的末尾,还有其他集合运算符。感谢您引导我注意这一点。
    SELECT ... FROM table1
    WHERE id IN (SELECT t1.id
                 FROM table1 t1 JOIN table2 t2 ON ...
                 WHERE ...
                 EXCEPT
                 SELECT t1.id
                 FROM table1 t1 JOIN table3 t3 ON ...
                 WHERE ...)
    FOR UPDATE OF table1;