【问题标题】:Ensuring table contains only unique values for certain fields确保表仅包含某些字段的唯一值
【发布时间】:2016-06-29 12:13:17
【问题描述】:

我有一个这样定义的 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 字段是唯一的?

【问题讨论】:

    标签: mysql import duplicates


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      使用此说明,您的配对将在整个表中是唯一的(不能插入重复的配对)。如果您尝试插入重复的对,您将收到此错误:

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

      另一种解决方案是在插入之前消除重复对。 为此,您可以使用例如http://openrefine.org/ 以前的谷歌精炼。我曾为此类任务使用过它,并且取得了一些不错的结果。

      希望对你有帮助。

      【讨论】:

        【解决方案3】:

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

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

        创建表数据 ( ID BIGINT(20) NOT NULL AUTO_INCREMENT, Unique_Hash BINARY(16) NOT NULL, 大小 BIGINT(20) 非空, 添加日期 s/DATETIME/TIMESTAMP/ DEFAULT s/NOT NULL/CURRENT_TIMESTAMP/, 主键(ID), s/INDEX/UNIQUE KEY/ (Unique_Hash) );

        现在我可以导入如下数据:

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

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

        【讨论】:

        • 不,这不仅会防止根据您在问题中的定义添加重复项,因为您仅将 unique_hash 字段定义为唯一索引,而在问题中您将 unique_hash 和 size 的组合描述为唯一性的要求。您的回答与您自己的问题不一致。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多