我一直在发现自己编写查询以避免在存在重复时插入 - 例如
select * from foobar where bar=barbar and foo=foofoo
然后使用mysql_num_rows()
检查PHP以查看结果数是否为> 0确定是否继续我的插入。
编辑:例如,假设用户想要向另一个用户发送邀请。我想确保在我的邀请表中,我不会添加具有相同对invited_id
和game_id
的其他条目。所以这需要某种检查。
这感觉效率低(而且有点脏)。有更好的方法吗?
答案 0 :(得分:5)
唯一索引怎么样?
UNIQUE索引创建一个约束,使索引中的所有值必须是不同的。如果您尝试添加具有与现有行匹配的键值的新行,则会发生错误。对于所有引擎,UNIQUE索引允许可以包含NULL的列的多个NULL值。
http://dev.mysql.com/doc/refman/5.1/en/create-table.html
编辑:
表单的列列表(col1,col2,...)创建多列索引。索引值是通过连接给定列的值形成的。
答案 1 :(得分:2)
在这种情况下,在(bar,foo)上创建一个唯一索引,以便插入在重复值上失败。你只需要在php中处理异常。这样,代码就更清晰,更快。
答案 2 :(得分:1)
只需在列上使用UNIQUE键,并使用INSERT IGNORE语句插入新行(重复行为IGNORED)。
请注意,UNIQUE键不能超过1000个字节,这意味着字段foo
和bar
中包含的潜在字节数不能超过1000个字节。如果这会产生问题,只需在插入时将CONCATENATED值MD5放入其自己的列中,例如(在PHP中)md5($ foo。$ bar),并将唯一键设置为该列。
CREATE TABLE `test_unique` (
`id` int(10) unsigned NOT NULL auto_increment,
`foo` varchar(45) default NULL,
`bar` varchar(45) default NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `Unique` (`foo`,`bar`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT IGNORE INTO `test_unique` VALUES
(1, 'foo1', 'bar1'),
(2, 'foo2', 'bar2');
INSERT IGNORE INTO `test_unique` VALUES
(2, 'foo2', 'bar2');