我这样定义了一个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字段是唯一的?
答案 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表中的欺骗。