2014-09-22 899 views
0

对不起,如果问题看起来很奇怪而且很愚蠢,但是我需要知道它是可能的还是什么。在mysql中运行更新查询后返回更新后的值

因此 我有以下查询更新请求表中的请求记录的状态。

$updateQ = "UPDATE requests SET status = status+1 WHERE rid = '$rid'"; 
if($this->db->query($updateQ)) 
    return $this->db->select('status')->from('requests')->where('rid', $rid)->get()->row('status'); 

我不知道我是否可以在执行查询,而不运行的另一个选择查询后立即得到更新状态字段的值。

+0

不,你不能得到它,在更新后,你可以得到的唯一的事情是受影响行,这是'1' – Ghost 2014-09-22 08:44:14

回答

1

不,你不能。我不明白,为什么你担心它。我猜,rid是你的主要关键。之后的SELECT应该如此之快,以至于你几乎不会注意到它。

+0

在跨国数据库中,这是不可靠的,直到你确定它是原子 – karmendra 2015-12-04 13:37:39

+0

@ka rmendra我认为你在这里弄混了一些东西。问题是,如果他能得到更新的值**而不运行另一个选择查询**。这不是关于价值是否由另一笔交易再次改变。实际上,[这种更新语句是安全的](http://stackoverflow.com/questions/3821468/sql-atomic-increment-and-locking-strategies-is-this-safe)。所以我的回答没有错。 – fancyPants 2015-12-04 14:29:20

+0

好吧,我同意,但我无法收回我的反对票,直到你编辑你的答案。 – karmendra 2015-12-04 14:47:37

1

您应该使用SELECT FOR UPDATE(for mySQL)或类似的东西来实现更新和选择最后一个值的原子性。

SELECT counter_field FROM child_codes FOR UPDATE; 
UPDATE child_codes SET counter_field = counter_field + 1; 

或使用LAST_INSERT_ID()如果您希望获取上次插入的ID以进行更新。

UPDATE counters 
SET value = LAST_INSERT_ID(value) + 1 
WHERE id = 1; 

然后

SELECT LAST_INSERT_ID(); 

读通select-update-single-statement-race-condition

感谢, ķ

+0

这是一般**的良好信息**,但在这种情况下并非真正必要。无论如何,upvote。 – fancyPants 2015-12-04 14:52:13