避免在多个列值上重复MySQL

时间:2011-11-25 09:48:55

标签: php mysql insert duplicates

我一直在发现自己编写查询以避免在存在重复时插入 - 例如

select * from foobar where bar=barbar and foo=foofoo

然后使用mysql_num_rows()检查PHP以查看结果数是否为> 0确定是否继续我的插入。

编辑:例如,假设用户想要向另一个用户发送邀请。我想确保在我的邀请表中,我不会添加具有相同对invited_idgame_id的其他条目。所以这需要某种检查。

这感觉效率低(而且有点脏)。有更好的方法吗?

3 个答案:

答案 0 :(得分:5)

唯一索引怎么样?

  

UNIQUE索引创建一个约束,使索引中的所有值必须是不同的。如果您尝试添加具有与现有行匹配的键值的新行,则会发生错误。对于所有引擎,UNIQUE索引允许可以包含NULL的列的多个NULL值。

http://dev.mysql.com/doc/refman/5.1/en/create-table.html

编辑:

  

表单的列列表(col1,col2,...)创建多列索引。索引值是通过连接给定列的值形成的。

http://dev.mysql.com/doc/refman/5.0/en/create-index.html

答案 1 :(得分:2)

在这种情况下,在(bar,foo)上创建一个唯一索引,以便插入在重复值上失败。你只需要在php中处理异常。这样,代码就更清晰,更快。

答案 2 :(得分:1)

只需在列上使用UNIQUE键,并使用INSERT IGNORE语句插入新行(重复行为IGNORED)。

请注意,UNIQUE键不能超过1000个字节,这意味着字段foobar中包含的潜在字节数不能超过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');