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 个查询。
我需要 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 个查询。