检查 MySQL 行是否存在


Check if MySQL Row exists

如何检查表行是否存在以及它是否不构成行?到目前为止,我有这个:

$id = $user->getID();
$username = $user->username;
$check = "SELECT id FROM users WHERE nickname = '".$username."'";
$result = mysql_query($check);
if(mysql_num_rows($result)){
$user->parent->mysql->query("INSERT INTO $ngtable (`id`, `namecolor`, `glowcolor`, `bubblecolor`, `bubbletext`, `bubbleglow`, `ringcolor`, `snowglow`) VALUES ('".$id."','0x','0x','0x','0x','0x','0x','0x')");
}else{
$user->parent->mysql->query("UPDATE $ngTable SET namecolor = '0x" . $arg . "' WHERE id = '" . $user->getID() . "'");
$user->sendPacket("%xt%sm%-1%0%$user->username, your name color is now: $arg%");
}

MySQL INSERT支持重复键更新 - 这将是最有效的方法。

例如。。。

INSERT INTO table_name (id, foo, bar) VALUES (7, 'baz', 'bat') ON DUPLICATE KEY UPDATE foo='baz', bar='bat'

当然,这取决于您的表具有唯一索引(主键就可以了),您的插入将导致冲突,从而触发更新。

尽管您需要对昵称设置一个表约束是唯一的,但最好的方法可能是使用 MySQL 替换语法,该语法一举完成您想要的。

replace INTO 
    $ngtable 
        (`id`, `namecolor`, `glowcolor`, `bubblecolor`, `bubbletext`, `bubbleglow`, `ringcolor`, `snowglow`) 
    VALUES 
        ('".$id."','0x','0x','0x','0x','0x','0x','0x')

从文档中:

REPLACE 的工作方式与 INSERT 完全相同,不同之处在于,如果表中的旧行与主键或 UNIQUE 索引的新行具有相同的值,则在插入新行之前将删除旧行。

MySQL使用以下算法进行替换(和加载数据...替换): 尝试将新行插入到表中 当插入因主键或唯一索引发生重复键错误而失败时: 从表中删除具有重复键值的冲突行 再次尝试将新行插入到表中