限制postgreSQL更新命令

问题描述:

我有一个给定结构的表,现在我想写一个查询,将从状态1传递2个xx产品到状态2.子代码对我来说是无关紧要的。限制postgreSQL更新命令

master_code| child_code | status_code 
-----------|------------|------------ 
    xx  | xx1  |  1 
    xx  | xx2  |  1 
    xx  | xx3  |  1 
    xx  | xx4  |  2 
    xx  | xx5  |  2 
    yy  | yy1  |  3 
    yy  | yy2  |  2 
    zz  | zz1  |  1 
    zz  | zz2  |  1 

我已经实现了基本的检查,当我用

update only product_child 
set product_status=1 
where product_status=2 

所有三个XX的得到了码2,我想对那个控制,我所期待的只是一个XX会得到代码变化与此命令

+1

只有一个...... *哪一个? – wildplasser 2012-07-11 12:01:33

+0

@wildplasser我想要任何一个xx更改状态子代码现在不在我的考虑范围内 – Mohit 2012-07-11 12:03:02

+0

*任意一个*:只是随机选择,但只有*完全*一个? – wildplasser 2012-07-11 12:08:28

如果你不关心哪个行被更新,这一点我会非常谨慎做的(请加PK表这个真的),那么你可以使用类似以下内容:

UPDATE 
    product_child 
SET 
    product_status = 1 
WHERE 
    CTID IN (SELECT CTID FROM product_child WHERE product_status = 2 and master_code = 'xx' LIMIT 1) 

CTID是一个唯一的行标识符 - 通过将子查询限制为1条记录,我们得到一个与符合WHERE子句的行对应的CTID。

+0

在目前的实施中,任何一个特定主人的随机孩子都会这样做。 master_code是处理特定的孩子FK 我有一个单独的逻辑 – Mohit 2012-07-11 12:15:20

+0

是的,我相信你应该有一些逻辑挑选出一个特定的一个 - 甚至一些为最早的记录简单能给你一些帮助。这会按照你的要求拉回一个随机的孩子。在语法错误或接近 “WHERE” LINE 3: – 2012-07-11 12:17:35

+0

你的代码是给错误 '错误的CTID IN(SELECT CTID仅WHERE product_status = ... ^ **********错误********** 错误:在“WHERE”处或附近的语法错误 SQL状态:42601' – Mohit 2012-07-11 12:19:14

我找到了一种方法

update only product_child 
set product_status =1 
where product_child_code in (select product_child_code 
       from product_child 
       where product_code = get_product_code('Baby Crib') 
       and product_status = 2 
       limit 5) 
+3

只有在处理继承的表时,才需要'only'关键字。它在“常规”桌上不做任何事情。 – 2012-07-16 09:23:07

也许你应该有一个过程做到这一点:

select * from update_status() 

编辑:

CREATE or replace FUNCTION update_status() returns character varying as $$ 
declare 
match_ret record; 
begin 
SELECT * INTO match_ret FROM product_child WHERE product_status = 2 LIMIT 1 for update ; 
UPDATE product_child SET status_code = '1' where child_code = match_ret.child_code ; 

return match_ret.child_code ; 
commit; 
end ; 
$$ LANGUAGE plpgsql; 

然后调用它 你也可以做这与一个'与':

WITH subRequest as (
SELECT child_code FROM product_child WHERE status = 2 LIMIT 1 FOR UPDATE 
) 
UPDATE product_child as p 
FROM subRequest 
WHERE p.child_code = subRequest.child_code ; 

Regards