请教一个问题:
我想把这两句mysql的语句合成一句,请问该怎么写?
sql_defense11="UPDATE world SET metal =metal-(2000*'$quantity_post') and metal>'$b' WHERE world.id_star =1 ";
sql_defense12="INSERT INTO construction (id_star, thing, quantity, time_begin) VALUES ('111', '1', '20', NOW())";
第一句的意思是如果金属够 金属自减这个数量
第二句的意思是如果满足条件一,则完成这个插入
谢谢!

解决方案 »

  1.   

    目的是   检查金属数量是否够,如果够,减掉消耗的数量   当语句一成功运行,那么也执行插入语句二.
    要求俩者是同步的  ,要么都成功  要么都失败.朋友还推荐下面的备选方案;
    一,储存
    @a = UPDATE world SET metal =metal-(2000*'$quantity_post') WHERE world.id_star =1  and metal>'$b';
                                                                    if(@a = ture,INSERT INTO construction (id_star, thing, quantity, time_begin) VALUES ('111', '1', '20', NOW()),'');
    二,事物处理  // connect to database  $dbh = mysqli_connect($host, $user, $pass, $db);  // turn off auto-commit  mysqli_autocommit($dbh, FALSE);  // run query 1  $result = mysqli_query($dbh, $query1);  if ($result !== TRUE) {  mysqli_rollback($dbh); // if error, roll back transaction  }  // run query 2  $result = mysqli_query($dbh, $query2);  if ($result !== TRUE) {  mysqli_rollback($dbh); // if error, roll back transaction  }  // and so on...  // assuming no errors, commit transaction  mysqli_commit($dbh);  // close connection  mysqli_close($dbh);  ?>
      

  2.   


    你执行第一句后判断一下执行是否成功,成功后执行第二句,否则就事务回滚不就行了?
    对于PHP和MYSQL之间打交道的内幕我不是很清楚,如果访问量大的话个人觉得可能先要锁表。
      

  3.   

    对了,表类型要设置为innodb,myisam是不支持事务的(以前,现在不知道支持不)
      

  4.   

    myisam是不支持事务的    4.1的版本还是
    谢谢大家我想这样可以合并成一句
    if(( UPDATE   world   SET   metal   =metal-(2000*'$quantity_post')   WHERE   world.id_star   =1     and   metal> '$b') =   ture,INSERT   INTO   construction   (id_star,   thing,   quantity,   time_begin)   VALUES   ('111',   '1',   '20',   NOW()),    ''); 但是该如何测试执行完句子1  恰好被中断呢?