【问题标题】:How to get the result of SELECT statement inside a transaction?如何在事务中获取 SELECT 语句的结果?
【发布时间】:2012-10-24 22:27:43
【问题描述】:

我无法通过 PostgreSQL 文档、Web 甚至 StackOverflow 获得关于这个简单问题的信息……我一定无法理解这里的重要内容。

我在 PostgreSQL 中做一个简单的SELECT/UPDATE 事务:

START TRANSACTION;
SELECT "column" FROM "table" WHERE "criterion" = 'value' AND "activated" = true;
UPDATE "table" SET "activated" = false WHERE "criterion" = 'value';
COMMIT

基本上,我需要在其activated 状态为true 时获取列的值,然后将其停用。 PostgreSQL 告诉我有 1 行结果被取消了

如果我执行以下操作(基本上没有UPDATE 语句的相同事务),也会发生同样的情况:

START TRANSACTION;
SELECT "column" FROM "table" WHERE "criterion" = 'value' AND "activated" = true;
COMMIT

我对交易有什么不明白的地方?任何SELECT 输出都不能从事务块中取出吗?

【问题讨论】:

  • 你通常会SELECT "column", the_primary_ky FROM ... 然后UPDATE ... SET ... WHERE the_primary_key = value_returned_from_select
  • 这取决于你打算做什么。这里不是这种情况

标签: postgresql transactions


【解决方案1】:

这将从更新的行中返回所有“列”的值:

UPDATE "table" SET "activated" = false WHERE "criterion" = 'value' AND "activated" = true
returning "column";

与交易无关。

returning 将返回值,就像发出 select 一样:

insert into foo (ticket, row, archived) values (3,7,true) returning *;
 ticket | row | archived 
--------+-----+----------
      3 |   7 | t

update foo
set archived = true
where not archived
returning *;
 ticket | row | archived 
--------+-----+----------
      2 |   5 | t

【讨论】:

  • 如果事务没有影响,第二个怎么解释?一个简单的SELECT 包裹在事务中隐藏了它的结果......我没有使用 PL/pgSQL,返回在这里不起作用。以前从未见过该命令
  • @user573152 它会像select一样返回。请参阅编辑后的帖子。 你如何解释第二个 第二个是什么?
  • 我在帖子中提供了 2 笔交易,但均无效。第二个是交易中的简单SELECT。那样没用,但这应该仍然有效,不是吗?哦,我终于用RETURNING 语句让它工作了。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-14
  • 1970-01-01
  • 2013-10-18
相关资源
最近更新 更多