如果存在,MySQL将更新一行,如果不存在则更新,以及一般查询建议

时间:2014-07-29 13:53:40

标签: php mysql sql

我有一个基于浏览器的游戏的个人项目,我目前正在使用旧代码,并尝试优化和更新所有内容。我有很多功能,如下面的一个,它基本上更新了球员项目数量。使用该项目时,该行将保留在数据库中,但金额设置为0,然后当玩家购买/找到更多该项目时更新金额。

在这里搜索之后,我有一个想法,像'更新,如果存在'可以工作,而不是使用COUNT查询,可能是更新的多查询,但我只是不确定实现这一目标的最佳方法,如果可能的话。

表格有一个自动递增的ID,但是玩家可以在表格中有多行,我用userID识别。

如果这是一个新问题我道歉,但我是自学成才,如果你不问那些知道自己在做什么的人,你就永远不会学习正确的做事方式:)

也很乐意获得有关代码的建议。

function power_caps_to_loot($userID, $itemID, $amount, $itemName, $updateInv) {

$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}
// check if user has any of items already
$query = "SELECT COUNT(itemID) from lootbag where userID = $userID AND itemID = $itemID";
$result = $mysqli->query($query);
$row = $result->fetch_array(MYSQLI_NUM);
$count = $row[0];

    // if user has/had some already update amount, else insert new row          
    if ($count > 0) {
        $query = "UPDATE lootbag SET amount = amount + $amount WHERE userID = $userID AND itemID = $itemID";
        $mysqli->query($query);
    } else {
        $query = "INSERT INTO lootbag (itemID, userID, amount, itemName, type, sub_type) 
        VALUES ($itemID, $userID, $amount, '$itemName', 'Cyborg Power Capsule', 'cyb_power')";
        $mysqli->query($query);
    }

    // if item comes from inventory, update amount
    if ($updateInv == 1) {
        $query = "UPDATE inventory SET amount = amount - $amount WHERE userID = $userID AND itemID = $itemID";
        $mysqli->query($query);
    }

$mysqli->close();

1 个答案:

答案 0 :(得分:3)

用于重复密钥更新或“upsert”

insert into .... on duplicate key update col1 = values(col1) ...

http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

将索引设置为不允许重复,并且该语句将处理其余的

INSERT INTO lootbag (itemID, userID, amount, itemName, type, sub_type) 
    VALUES ($itemID, $userID, $amount, '$itemName', 'Cyborg Power Capsule', 'cyb_power')
ON DUPLICATE KEY UPDATE amount = amount + values(amount)

应该有效,假设您有关于商品ID和用户ID的唯一索引