检查MySQL Row是否存在

时间:2013-10-15 22:09:19

标签: php mysql

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

$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%");
}

2 个答案:

答案 0 :(得分:2)

MySQL INSERT支持ON DUPLICATE KEY UPDATE - 这将是最有效的方式。

例如......

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

当然,这依赖于您的表具有唯一索引(主键将执行),您的插入将导致与之冲突,从而触发更新。

答案 1 :(得分:0)

虽然你需要在昵称上设置一个表约束是唯一的,但最好的方法可能是使用MySQL replace syntax来完成你想要的一切。

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

来自文档:

  

REPLACE的工作原理与INSERT完全相同,只是如果表中的旧行与PRIMARY KEY或UNIQUE索引的新行具有相同的值,则在插入新行之前删除旧行。

     

MySQL使用以下算法进行REPLACE(和LOAD DATA ... REPLACE):       尝试将新行插入表中       插入失败,因为主键或唯一索引发生重复键错误:           从表中删除具有重复键值的冲突行           再次尝试将新行插入表