确保表仅包含某些字段的唯一值

时间:2016-03-14 12:41:46

标签: mysql import duplicates ignore

我这样定义了一个MYSQL表:

CREATE TABLE Data (
   ID BIGINT(20) NOT NULL AUTO_INCREMENT,
   Unique_Hash BINARY(16) NOT NULL,
   Size BIGINT(20) NOT NULL,
   DateAdded DATETIME NOT NULL,
   PRIMARY KEY (ID),
   INDEX (Unique_Hash)
);

我希望用1,000条记录填充此表,但不应将Unique_Hash / Size对添加到另一条记录中。相反,我想确保如果任何与我现有的Unique_Hash / Size值匹配的新记录被忽略。它是DateAdded字段,它打破了我的ON DUPLICATE IGNORE参数。

如何安全地将数据导入此表,以确保我的记录相对于我的Unique_Hash和Size字段是唯一的?

3 个答案:

答案 0 :(得分:0)

在Unique_Hash和Size字段上创建多列唯一索引。这肯定会阻止任何具有相同数据的条目插入表中。

导入数据时,您可以使用insert ignore ...语句忽略由于唯一索引冲突而在插入过程中收到的任何错误。这些将被报告为警告。

请注意使用ignore option的副作用:

  

如果发生错误,将触发错误的数据转换会中止语句   未指定IGNORE。使用IGNORE时,无效值将调整为   最接近的值并插入;警告产生但是   声明不会中止。您可以使用mysql_info()C来确定   API函数实际插入表中的行数。

答案 1 :(得分:0)

您可以在表格上添加一个索引,以确保两列的唯一性条件:

ALTER TABLE `Data` ADD UNIQUE `Unicity` (`Unique_Hash`, `Size `);

使用此指令,您的对将在表中是唯一的(不能插入重复对)。如果您尝试插入重复对,则会出现此错误:

#1062 - Duplicate entry 'XXX-XXXX' for key 'Unicity' 

另一种解决方案可能是在插入之前消除重复对。 为此,您可以使用http://openrefine.org/进行操作 以前谷歌精炼。我曾经为这类任务工作过一次,并且取得了不错的成绩。

我跳它会帮助你。

答案 2 :(得分:-1)

这是我所做的,似乎解决了我的问题:

我(重新)将我的表定义为:

创建表数据(    ID BIGINT(20)NOT NULL AUTO_INCREMENT,    Unique_Hash BINARY(16)NOT NULL,    大小BIGINT(20)NOT NULL,    DateAdded s / DATETIME / TIMESTAMP / DEFAULT s / NOT NULL / CURRENT_TIMESTAMP / ,    PRIMARY KEY(ID),     s / INDEX / UNIQUE KEY / (Unique_Hash) );

现在我可以导入数据,例如:

  

INSERT IGNORE INTO数据(Unique_Hash,Size)SELECT Hash AS Unique_Hash,Size FROM Temp;

现在自动添加CURRENT_TIME字段,并防止导入Temp表中的欺骗。