0

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

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

2 回答 2

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'

自然地,这依赖于您的表具有唯一索引(主键可以),您的插入将导致冲突并因此触发更新。

于 2013-10-15T22:14:44.113 回答
0

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

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)使用以下算法:尝试将新行插入表中 当插入失败时,因为主键或唯一索引发生重复键错误:从表中删除具有重复键值的冲突行再次尝试将新行插入表中

于 2013-10-15T22:15:44.030 回答