【问题标题】:Prevent duplicate data in a table with more than 20000 records防止超过 20000 条记录的表中出现重复数据
【发布时间】:2015-07-20 11:07:23
【问题描述】:

每天我在 mysql 中添加近 5000 条新记录,我想防止在表中插入重复行,我想我应该在任何插入操作之前检查所有银行,是否合适? 或者有什么更好的办法吗?? 提前谢谢

【问题讨论】:

标签: php mysql


【解决方案1】:

通过对不可重复的字段属性应用唯一索引来防止数据模型被软件破坏是一个不错的选择。

最好在插入数据之前向数据库询问重复的候选人。

最好的办法是将两者结合起来。数据库模型的安全性和软件层中的重复问题,因为 a) 错误处理比查询更昂贵,b) 约束保护数据免受人为故障的影响。

mysql 使用 CREATE UNIQUE INDEX 语句支持唯一索引。

例如:在 BAR(X,Y,Z) 上创建唯一索引 IDX_FOO;

在表 BAR 上创建唯一索引。运行重复查询时也将使用此索引 - 大大加快了处理速度。

更多详情请见MySQL Documentation

【讨论】:

  • 感谢 gorefest,我缺少源!有时我更喜欢重复数据而不是检查所有表,我认为此操作需要大量源,但是...?
  • 如果您知道防止重复的列,您所需要的只是索引。然后,INSERT 将导致数据库阻止具有唯一索引冲突的操作。如果您的重复项很少,这是防止受骗的最简单方法。如果您有许多重复的候选者,您应该首先查询重复的值,以防止更大的错误处理开销。这可以通过 SELECT 索引列轻松实现。
【解决方案2】:

当您遇到数据完整性问题时,您希望数据库强制执行规则(如果可能)。在您的情况下,您可以使用唯一索引或唯一约束来执行此操作,它们是同一事物的两个名称。这是示例语法:

create unique index idx_table_col1_col2 on table(col1, col2)

您希望在数据库中执行此操作,原因有三个:

  • 您希望数据库知道该列是唯一的。
  • 您不希望多线程应用程序“意外”插入重复值。
  • 您不希望将如此重要的检查放入应用程序中,否则它们可能会“意外”被删除。

然后,MySQL 具有非常有用的结构来处理重复项,特别是 insert . . . on duplicate key updateinsert ignorereplace

当您从应用程序运行 SQL 查询时,无论如何您都应该检查错误,因此捕获重复键错误应该不会对应用程序造成额外负担。

【讨论】:

    【解决方案3】:

    首先,任何需要唯一的列都可以使用UNIQUE 约束:

    CREATE TABLE IF NOT EXISTS tableName 
    (id SERIAL, someUniqueColumnName VARCHAR(255) NOT NULL UNIQUE);
    

    请参阅 MySQL 文档for adding uniqueness to existing columns

    您需要确定表中的重复项是什么,因为唯一性并不总是仅限于单个列。例如,在一个表中,您存储具有相应 id 的用户以用于其他东西,那么它可能会被组合在一起,它们必须是唯一的。为此,您可以拥有PRIMARY KEY,它使用两列:

    CREATE TABLE IF NOT EXISTS tableName (
        id BIGINT(20) UNSIGNED NOT NULL, 
        pictureId BIGINT(20) UNSIGNED NOT NULL, 
        someOtherColumn VARCHAR(12),
        PRIMARY KEY(id, pictureId));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-17
      • 2014-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多