2013-10-15 66 views
0

如何检查表行是否存在以及是否存在行?到目前为止,我有这个:检查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%"); 
} 
+0

我相信你想翻转你'如果/ else'块,因为当'如果( mysql_num_rows($ result))'== true,id存在于用户中,所以你想要做更新,否则id在用户中不存在,所以你需要做一个插入? – Sean

+0

如果ID不在表中,我希望MySQL插入它,如果它在表中它应该更新 – FrostyGamer150

回答

2

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

例如...

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

当然,这依赖于具有唯一索引(主键即可),你的插入会引起冲突,从而触发更新你的表。

+0

我不明白这个 – FrostyGamer150

+0

@ phil-lavin我发布的代码将插入行或删除并插入一个新的,如果有的话。 (有关更多详细信息,请参阅我的答案下面的注释) – Fluffeh

+0

'REPLACE INTO'将删除现有的行。 OP仅更新一列,因此REPLCE将丢失其他列上的所有数据。 – 2013-10-15 22:25:21

0

尽管您需要在昵称上设置一个表格限制为唯一,但最好的方法可能是使用MySQL replace syntax,它可以一举实现您想要的功能。

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

从文档:

更换作品酷似INSERT,不同之处在于,如果一个老行的表具有相同的值作为主键的新行或唯一索引,旧行在插入新行之前被删除。

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

+0

'REPLACE'不会更新现有的行 - 它会删除它。该行中的任何现有数据都将丢失。 – 2013-10-15 22:19:26

+0

@MikeW是的,尽管它看起来像这样的问题中的代码不会是一个问题,他似乎有行中的所有数据? – Fluffeh

+0

对于INSERT,是的。对于更新,只更改一列。您的建议将会丢失其他栏中的任何数据。 – 2013-10-15 22:24:07