【问题标题】:INSERT IGNORE or INSERT WHERE NOT ININSERT IGNORE 或 INSERT WHERE NOT IN
【发布时间】:2011-11-05 13:14:27
【问题描述】:

我有一个 900 万行的表,由于其庞大的规模,我正在努力处理所有这些数据。

我想要做的是在不覆盖数据的情况下将 IMPORT CSV 添加到表中。

在我做这样的事情之前; INSERT if not in(select email from tblName where source = "number" and email != "email") INTO (email...) VALUES ("email"...)

但我担心我会再次崩溃服务器。我希望能够将 10,000 行插入到一个表中,但前提是它不在 source = "number" 的表中。

否则我会在电子邮件列中使用唯一的。

简而言之,我想通过检查两件事来尽快插入而不向表中引入重复项。如果 email != "email" AND source != "number" 然后插入到表中,否则什么也不做。而且我也不想要错误报告。

我很抱歉我的措辞不好,这个问题听起来有点傻。

我只是很难适应无法通过下载备份并在出现问题时上传来对数据进行测试。我讨厌大型数据集:)

感谢大家的宝贵时间 -大事

【问题讨论】:

    标签: php mysql bulkinsert large-data


    【解决方案1】:

    如果您在这些字段上有唯一键,则可以使用带 IGNORE 选项的 LOAD DATA INFILE。比逐行插入快,也比多插入快。

    http://dev.mysql.com/doc/refman/5.1/en/load-data.html

    【讨论】:

    • +1 表示LOAD DATA INFILE。如果 OP 可以使用,那将是最佳选择。
    • 我没有打开唯一键,因为电子邮件可能会以不同的来源多次弹出。我不能使用独特的,但谢谢你的想法。
    • 复合唯一键(电子邮件,来源)怎么样?
    • @Andrej L. 所以你是这么说的; “INSERT INTO table_name(email, source, ...) VALUES ('email', 'source', ...) ON DUPLICATE KEY(email,source) UPDATE email = email;"谢谢你的提示;)
    【解决方案2】:

    emailsource 列上设置UNIQUE 约束。

    然后做:

    INSERT INTO table_name(email, source, ...) VALUES ('email', 'source', ...)
    ON DUPLICATE KEY UPDATE email = email;
    

    INSERT IGNORE 不会通知您任何类型的错误。我不会推荐它。我也不推荐INSERT ... WHERE NOT IN。 MySQL 已经为此提供了很好的优化功能。这就是INSERT ... ON DUPLICATE KEY UPDATE 存在的原因。

    【讨论】:

    • update 语句不会将电子邮件更新为当前值吗?似乎INSERT IGNORE 会是更好的选择。
    • @Chris Henry:是的,它将更新为email 列的当前值。阅读问题"INSERT IGNORE" vs "INSERT … ON DUPLICATE KEY UPDATE" 的已接受答案,详细解释为什么不应该使用INSERT IGNORE
    • 我没有设置唯一键,我也无法设置它,因为电子邮件被多次使用,源中的值不同。我必须检查源中不存在具有相同值的电子邮件。 (SELECT id FROM theTable WHERE email="$email" AND source = "NUMBER") - 如果返回 0 行,则可以插入。
    • @TheNextBigThing:如果您使用AND 检查它们,那么您可以使用UNIQUE 约束。就像我建议的email AND source 应该是UNIQUE,这是一个复合约束。
    • @Shef,先生,你让我大吃一惊。我有点困惑。这就是我的想法。 INSERT INTO table_name(email, source, ...) VALUES ('email', 'source', ...) ON DUPLICATE email AND source UPDATE 1=1;// 我不想更新任何东西。我想跳过它。我学到了很多东西。我以为我很了解 MySQL :)
    猜你喜欢
    • 1970-01-01
    • 2018-01-08
    • 2010-10-07
    • 2017-02-14
    • 2012-04-15
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多