使用 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 ,或者我可以(应该/如何)结合这两个查询?
你不能从这个查询中得到它(你只能得到受影响的行数,但就是这样)。如果您需要,您应首先SELECT
根据您的条件执行以下操作:
SELECT `id` FROM `mytable`
WHERE (`col1`='$col1[0]' AND `col2`='$col2[0]')
OR (`col1`='$col1[1]' AND `col2`='$col2[1]')
OR (...)
然后UPDATE
使用WHERE
fetched id
s。我不建议UPDATE
您使用 currentWHERE
子句,因为同时(在您的SELECT
和之间UPDATE
)数据库内容可能会发生变化,因此您可能会更新您已SELECT
编辑的不同行。或者使用表锁定(但我认为这里没有意义)。
Mysql中没有OUTPUT
子句。您需要在更新之前读取状态或创建将值存储OLD.status
在其他表中的触发器。
您不能有一个查询来更新行并在更新之前记录当前状态。
您最好有一个“日志表”,与您的“表”具有相同的架构加上一个时间戳,但它只会存储历史数据,即单个时间点的行状态,就像版本控制系统一样。
例子:
表用户:ID、用户名、电子邮件、电话
表UserLog:ID、用户名、电子邮件、电话、时间戳
因此,在更新表 User 上的行之前,您首先要执行 SELECT 和 INSERT,如下所示:
insert into UserLog
select Id, Username, Email, Telephone, Now() from User where Id=$Id