【问题标题】:avoiding duplicates in MySQL on mulitple column values避免 MySQL 中多个列值的重复
【发布时间】:2011-11-25 09:48:54
【问题描述】:

我不断发现自己在编写查询以避免在有重复项时插入 - 比如

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

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

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

这感觉效率低下(而且有点脏)。有没有更好的办法?

【问题讨论】:

  • 你能请。进一步详细说明,以便我能够给你正确的答案。
  • 显而易见的答案是 foo、bar 列上的唯一索引 - 你考虑过吗?

标签: php mysql insert duplicates


【解决方案1】:

唯一索引呢?

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

【讨论】:

  • 正确,但它位于两行或多行上。我不希望它在任一列获得重复值时失败,只有当两者都这样做时
  • 两列的唯一索引要求两者的组合是唯一的。所以 "foo,foo" , "foo,bar" , "bar,foo" 和 "bar,bar" 会共存。
【解决方案2】:

在这种情况下,在 (bar, foo) 上创建唯一索引,以便插入重复值时失败。您只需要在 php.ini 中处理异常。这样,代码更简洁、更快。

【讨论】:

  • 正确,但它位于两行或多行上。我不希望它在任一列获得重复值时失败,只有当两者都这样做时
  • 就是这样。如果唯一索引在列集 (bar, foo) 上,则如果值的组合 (bar 值, foo 值) 是重复的,则插入失败,但当单独的 bar 或单独的 foo 是重复时则不会。
【解决方案3】:

只需在列上使用唯一键并使用 INSERT IGNORE 语句插入新行(忽略重复行)。

请注意,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');

【讨论】:

    猜你喜欢
    • 2015-08-09
    • 1970-01-01
    • 2017-01-29
    • 2018-08-29
    • 1970-01-01
    • 2019-11-30
    • 1970-01-01
    • 2013-01-14
    • 2017-08-23
    相关资源
    最近更新 更多