Mysql:首先 Select 然后在一次查询中更新

Mysql: First Select then Update in One Query

我需要 select table 的行,然后更新行的字段。 例如:

"SELECT * FROM `messages` WHERE `timestamp`>'1422680952'"

然后我想更新该行的一个字段。

您可以为此目的使用交易 您可以在其中同时拥有 select 并在 Transaction

中进行更新
START TRANSACTION;

  -- Let's get the current value
  SELECT value FROM counters WHERE id = 1 FOR UPDATE;

   -- Increment the counter
  UPDATE counters SET value = value + 1 WHERE id = 1;

  COMMIT;

一般都是这样完成的

try {
    // First of all, let's begin a transaction
    $db->beginTransaction();

    // A set of queries; if one fails, an exception should be thrown
    $db->query('select query');
    $db->query('update query');

    // If we arrive here, it means that no exception was thrown
    // i.e. no query has failed, and we can commit the transaction
    $db->commit();
} catch (Exception $e) {
    // An exception has been thrown
    // We must rollback the transaction
    $db->rollback();
}

您可以使用下面的语法,如果您的目的只是更新 table:

Update messages
Set display = 1
Where timestamp >'1422680952' 

要更新行,您不必 select 行。尝试类似的东西:

UPDATE messages
SET display = 1
WHERE timestamp >'1422680952' 

您描述的操作,从 SELECT 执行 UPDATE 返回结果集不能在单个 SQL 语句中执行在 MySQL.

您需要两个单独的 SQL 语句:一个 SELECT 和一个 UPDATE.

就MySQL而言,没必要运行一个SELECT,然后运行一个UPDATE,可以[=36] =] 只是一个 UPDATE.

UPDATE `messages` SET somecol = 'somevalue' WHERE `timestamp`>'1422680952'

(问题中的查询用双引号括起来。这使我们怀疑您是 运行 从数据库接口库中用 PHP 等语言编写此语句。)

可以让多个语句作为单个事务的一部分执行。但就 MySQL 服务器本身如何实际处理指定操作而言,这将是两个单独的语句。

警告:此代码未作为答案或工作代码提供。而是进一步解释题中的概念。

我认为OP想要的是这样的-

"SELECT *, (UPDATE messages SET display = display + 1 WHERE key = key) AS display FROM messages WHERE timestamp > '1422680952'"

这可以用 SELECT 作为子查询,但我不能说用 UPDATE 是否可行。

我 运行 在我的应用程序中遇到类似情况时遇到了这个问题。我需要存储视图数,即 table.row 上的数据库命中数,而无需编写 2 个查询。