【问题标题】:INSERT and Update at the same time or Use Transact in SQL Query同时 INSERT 和 Update 或在 SQL Query 中使用 Transact
【发布时间】:2013-04-26 09:38:39
【问题描述】:

我有这 3 个查询:

$sql1 = "INSERT INTO bag(bag_id, chara_id, item_id, item_qty)VALUES(NULL,:id,:item_id,'1')";
$sql2 = "UPDATE chara SET chara_gold = chara_gold - :gold WHERE chara_id = :id"; 
$sql3 = "UPDATE shop SET item_qty = :qty WHERE item_id = :item_id";

并拥有这 3 张桌子:

  1. 角色

    +----------+------------+----------------+-------------+------------+----------+----------+-----------+-----------+
    | chara_id | chara_name | chara_class_id | chara_level | chara_gold | chara_hp | chara_mp | chara_atk | chara_def |
    +----------+------------+----------------+-------------+------------+----------+----------+-----------+-----------+
    |        1 | LawrenceX  |              1 |           1 |       1000 |     1000 |     1000 |         7 |         3 |
    |        3 | Viscocent  |              2 |           1 |       1000 |      900 |     1100 |         5 |         5 |
    |        4 | Piatos     |              1 |           1 |       1000 |     1000 |     1000 |         7 |         3 |
    |        5 | Hello      |              1 |           1 |       1000 |     1000 |     1000 |         2 |         8 |
    |        6 | Sample     |              3 |           1 |       1000 |     1100 |      900 |         9 |         1 |
    |        8 | Sampuro    |              2 |           1 |       1000 |     1500 |      100 |         5 |         5 |
    |       12 | fail       |              2 |           1 |       1000 |      900 |      100 |         5 |         5 |
    +----------+------------+----------------+-------------+------------+----------+----------+-----------+-----------+
    
  2. +---------+-----------------+------------+
    | item_id | item_name       | item_price |
    +---------+-----------------+------------+
    |       0 | Halberd         |        400 |
    |       1 | Axe             |        200 |
    |       2 | Wooden Sword    |        225 |
    |       3 | Dagger          |         55 |
    |       4 | Bow             |        120 |
    |       5 | Helmet          |        155 |
    |       6 | Tunic           |         50 |
    |       7 | Armour          |        150 |
    |       8 | Necklace        |        199 |
    |       9 | Studded Leather |        240 |
    +---------+-----------------+------------+
    
  3. 商店

    +---------+---------+------------+----------+
    | shop_id | item_id | item_price | item_qty |
    +---------+---------+------------+----------+
    |       1 |       1 |        200 |       99 |
    |       2 |       2 |        225 |       99 |
    |       3 |       3 |         55 |       99 |
    |       4 |       4 |        120 |       99 |
    |       5 |       5 |        155 |       99 |
    |       6 |       6 |         50 |       99 |
    |       7 |       7 |        150 |       99 |
    |       8 |       8 |        199 |       99 |
    +---------+---------+------------+----------+
    

场景:

  1. 我想在袋子item_id 列中添加一个项目,带有chara's id
  2. 然后将charas gold 减去他购买的商品金额(基于店铺item_price)。
  3. 然后在shop表中将所购买商品的item_qty减1。

可以在 1 个查询中完成吗? 我也想用transact。

【问题讨论】:

    标签: php mysql insert sql-update


    【解决方案1】:

    您不能在一个查询中更新多个表。但是,您可以使用事务使其立即发生:

    $db = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
    $db->exec("SET CHARACTER SET utf8");      // Sets encoding UTF-8
    
    try {
        $db->beginTransaction();
    
        $q1 = $db->prepare("INSERT INTO bag(bag_id, chara_id, item_id, item_qty)VALUES(NULL,:id,:item_id,'1')");
        $q1->bindValue(':id', $yourId);
        $q1->bindValue(':item_id', $yourItemId);
        $q1->execute();
    
        $q2 = $db->prepare("UPDATE chara SET chara_gold = chara_gold - :gold WHERE chara_id = :id");
        $q2->bindValue(':gold', $yourItemPrice);
        $q2->bindValue(':id', $yourCharaId);
        $q2->execute();
    
        $q3 = $db->prepare("UPDATE shop SET item_qty = :qty WHERE item_id = :item_id");
        $q3->bindValue(':qty', $yourQty);
        $q3->bindValue(':item_id', $yourItemId);
        $q3->execute();
    
        $db->commit();
    } catch (Exception $e) {
        $db->rollback();
    }
    

    【讨论】:

    • 我明天会试试这个:')
    • 在哪里绑定查询中的变量?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 2018-08-02
    相关资源
    最近更新 更多