Mysql:首先选择然后在一个查询中更新

时间:2015-01-31 05:34:41

标签: mysql select sql-update

我需要选择表的行然后更新行的字段。 例如:

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

然后我想更新那些行的字段。

5 个答案:

答案 0 :(得分:2)

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

您需要两个单独的SQL语句:SELECTUPDATE

就MySQL而言,在运行SELECT之前没有必要运行UPDATE,只能运行UPDATE

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

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

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

答案 1 :(得分:0)

您可以将交易用于此目的 您可以在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();
}

答案 2 :(得分:0)

如果您的目的只是更新表格,则可以使用以下语法:

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

答案 3 :(得分:0)

要更新行,您不必选择行。尝试类似:

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

答案 4 :(得分:0)

注意:该代码不作为答案或工作代码出现。但是要进一步解释这个问题的概念。

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

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

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

当我在应用程序中遇到类似案例时,我遇到了这个问题。我需要存储视图数,即table上的数据库命中数。row而不写2个查询。