【问题标题】:sqlite insert while drop complete duplicatesqlite 在删除完全重复时插入
【发布时间】:2015-06-07 18:40:40
【问题描述】:

我正在爬取一些网站并将结果存储在 sqlite 中,因为我的爬取可能每个月都会重复,但我不想将重复的结果存储在我的数据库中,我该怎么办?

比如我第一次会

insert into tableName(A, B, C, D, E) values(a,b,c,d,e) 

那么我的数据库会有这条记录,下次我抓取这个网站时,我也会这样做,但我不想存储重复的结果,我能做的最好的方法是什么?

另外,如果我使用 MySQL 该怎么办?

【问题讨论】:

  • 什么构成重复记录?所有五个值都必须相同吗?

标签: mysql database sqlite


【解决方案1】:

使用 sqlite,create your table with a UNIQUE constraint:

CREATE TABLE tableName (A INTEGER, B INTEGER, C INTEGER, D INTEGER, E INTEGER,
UNIQUE (A, B, C, D, E));

然后

INSERT OR IGNORE INTO tableName (A, B, C, D, E) values (a,b,c,d,e);

will only insert a new record if (a,b,c,d,e) is unique -- 即尚未出现在表中 tableName

add a UNIQUE index to an already existent table

CREATE UNIQUE INDEX unique_idx on tableName(A, B, C, D, E);

或者,使用 MySQL,create a table with a unique index

CREATE TABLE tableName (A INT, B INT, C INT, D INT, E INT,
UNIQUE KEY unique_idx (A, B, C, D, E))

然后use INSERT IGNORE:

INSERT IGNORE INTO tableName (A, B, C, D, E) values (a,b,c,d,e) 

add a UNIQUE KEY index to an already existent table

ALTER TABLE tableName ADD UNIQUE KEY unique_idx (A, B, C, D, E); 

【讨论】:

  • 每张表是只有一个索引还是几个?
  • 一张桌子可以有多张。
  • 谢谢!另一个问题,这样一来,是否意味着所有 A(或 B 或 C..)都必须是唯一的?
  • 不,这意味着元组 (A,B,C,D,E) 必须是唯一的。您当然可以更改标准...
  • 谢谢,你很有帮助!
【解决方案2】:

你可以使用insert ignore

SQLite

insert or ignore into tableName(A, B, C, D, E) values(a,b,c,d,e) 

MySQL

insert ignore into tableName(A, B, C, D, E) values(a,b,c,d,e) 

注意这两个代码的区别是,它们是不一样的。

这只有在他们有某种主键时才有效。

【讨论】:

    【解决方案3】:

    您可以创建一个临时/辅助表,例如 temp_tableName,其架构与 tableName 相同。然后在爬取时执行类似

    insert into temp_tableName select * from tableName;
    
    delete from tableName;
    
    insert into tableName(A, B, C, D, E) values(a,b,c,d,e)  
    

    需要辅助表,因为如果爬行插入失败,那么您有一个备份来存储。此外,考虑在 Transaction 块中执行此步骤 DELETE/INSERT 以实现原子性。

    【讨论】:

    • 这有帮助,但是如果我发现它已经在表中,我可以删除它吗?我最初的想法是 select * from tableName where A=a, B=b, C=c, D=d, E=e 并检查是否有这样的记录。这是一个好方法吗?
    • 取决于,如果您正在执行行/行插入,那么可能是的,但会有点贵。由于插入是从爬虫中发生的,我相信这将是批量插入;回答时牢记这一点。
    猜你喜欢
    • 2020-11-29
    • 2013-08-02
    • 1970-01-01
    • 2016-01-04
    • 1970-01-01
    • 2011-03-21
    • 2022-11-14
    • 1970-01-01
    • 2012-07-14
    相关资源
    最近更新 更多