下面的查询在mysql终端、工作台和php中以不同的方式执行。 mysql 终端和工作台给出相同的结果,但 php 给出不同的结果(看起来查询执行了 2 次)。 我想减少 1 件商品的数量。但在 php(codeigniter ,pdo connection) 中,它从数量中减去 2 个项目(总是我提到的两倍)。 注意:我很确定我不会执行此查询两次(在循环中)。
UPDATE tbl_stock tsk,
(SELECT
tsk.id_stock, tsk.qty
FROM
tbl_store ts
inner join tbl_stock tsk ON ts.id_store = tsk.id_store
where
ts.id_physical_place = 2
and ts.store_status = 1
and tsk.stock_status = 1
and tsk.id_products = 796
limit 1) tmp
SET
tsk.qty = (if(tmp.qty >= 1,
(tmp.qty - 1),
ifnull(tmp.qty, 0)))
WHERE
tsk.id_stock = tmp.id_stock
提前致谢!
更新:
从终端 ->
查询正常,1 行受影响,2 条警告(0.03 秒) 匹配的行:1 更改:1 警告:0
注意(代码 1592):由于 BINLOG_FORMAT = STATEMENT,使用语句格式写入二进制日志的语句不安全。该语句不安全,因为它使用了 LIMIT 子句。这是不安全的,因为无法预测所包含的行集。 注意(代码 1592):由于 BINLOG_FORMAT = STATEMENT,使用语句格式写入二进制日志的语句不安全。从另一个表中进行选择后写入具有自动增量列的表的语句是不安全的,因为检索行的顺序决定了将写入哪些行(如果有)。该顺序无法预测,并且在主设备和从设备上可能有所不同。
最佳答案
没有想法。 但请尝试按照您在上面的网址中提到的那样单独执行它们
$mod_select = $this->db->mod_select("SELECT
tsk.id_stock, tsk.qty
FROM
tbl_store ts
inner join tbl_stock tsk ON ts.id_store = tsk.id_store
where
ts.id_physical_place = " . $all_userdata['id_physical_place'] . "
and ts.store_status = 1
and tsk.stock_status = 1
and tsk.id_products = " . $value['itm'] . " limit 1");
if ($mod_select[0]->qty >= $value['qty']) {
$this->db->update('tbl_stock', array('qty' => $mod_select[0]->qty - $value['qty']), array('id_stock' => $mod_select[0]->id_stock));
}
希望这有帮助。
关于php - Mysql 更新查询运行两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22251071/