防止具有超过20000条记录的表中的重复数据

时间:2015-07-20 11:07:23

标签: php mysql

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

3 个答案:

答案 0 :(得分:1)

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

在插入数据之前,向数据库询问重复的候选者会更好。

最好的是,两者结合起来。数据库模型的安全性和软件层中重复的问题,因为a)错误处理比查询要昂贵得多,b)约束保护数据免于人为失败。

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

例如:在BAR(X,Y,Z)上创建UNIQUE INDEX IDX_FOO;

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

有关详细信息,请参阅MySQL Documentation

答案 1 :(得分:1)

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

create unique index idx_table_col1_col2 on table(col1, col2)

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

  • 您希望数据库知道该列是唯一的。
  • 您不希望多线程应用程序“意外”插入重复值。
  • 您不希望将这些重要的支票放入应用程序中,以免“意外”删除它们。

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

当您从应用程序运行SQL查询时,您应该检查错误,因此捕获重复键错误应该不会给应用程序带来额外负担。

答案 2 :(得分:0)

首先,任何需要唯一的列都可以使用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));