0

使用 PHP 和 MySQL,我有一个如下所示的查询:

UPDATE mytable 
   SET status='$newstatus' 
 WHERE (col1='$col1[0]'AND col2='$col2[0]') 
   OR (col1='$col1[1]'AND col2='$col2[1]') 
   OR (...);

我实际上需要在更新之前记录每一行的当前“状态”。在此之前我是否需要做一个单独的 SELECT ,或者我可以(应该/如何)结合这两个查询?

4

3 回答 3

1

你不能从这个查询中得到它(你只能得到受影响的行数,但就是这样)。如果您需要,您应首先SELECT根据您的条件执行以下操作:

SELECT `id` FROM `mytable`
WHERE (`col1`='$col1[0]' AND `col2`='$col2[0]')
   OR (`col1`='$col1[1]' AND `col2`='$col2[1]')
   OR (...)

然后UPDATE使用WHEREfetched ids。我不建议UPDATE您使用 currentWHERE子句,因为同时(在您的SELECT和之间UPDATE)数据库内容可能会发生变化,因此您可能会更新您已SELECT编辑的不同行。或者使用表锁定(但我认为这里没有意义)。

于 2012-09-04T16:23:55.737 回答
1

Mysql中没有OUTPUT子句。您需要在更新之前读取状态或创建将值存储OLD.status在其他表中的触发器。

于 2012-09-04T16:33:12.780 回答
0

您不能有一个查询来更新行并在更新之前记录当前状态。

您最好有一个“日志表”,与您的“表”具有相同的架构加上一个时间戳,但它只会存储历史数据,即单个时间点的行状态,就像版本控制系统一样。

例子:

用户:ID、用户名、电子邮件、电话

UserLog:ID、用户名、电子邮件、电话、时间戳

因此,在更新表 User 上的行之前,您首先要执行 SELECT 和 INSERT,如下所示:

insert into UserLog
select Id, Username, Email, Telephone, Now()  from User where Id=$Id
于 2012-09-04T16:41:39.647 回答