限制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会得到代码变化与此命令
如果你不关心哪个行被更新,这一点我会非常谨慎做的(请加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。
在目前的实施中,任何一个特定主人的随机孩子都会这样做。 master_code是处理特定的孩子FK 我有一个单独的逻辑 – Mohit 2012-07-11 12:15:20
是的,我相信你应该有一些逻辑挑选出一个特定的一个 - 甚至一些为最早的记录简单能给你一些帮助。这会按照你的要求拉回一个随机的孩子。在语法错误或接近 “WHERE” LINE 3: – 2012-07-11 12:17:35
你的代码是给错误 '错误的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)
只有在处理继承的表时,才需要'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
只有一个...... *哪一个? – wildplasser 2012-07-11 12:01:33
@wildplasser我想要任何一个xx更改状态子代码现在不在我的考虑范围内 – Mohit 2012-07-11 12:03:02
*任意一个*:只是随机选择,但只有*完全*一个? – wildplasser 2012-07-11 12:08:28