MariaDB - 管理重复

  • 简述

    正如前面课程中所讨论的,MariaDB 在某些情况下允许重复的记录和表。由于不同的数据或对象类型,或者由于操作对象的唯一生命周期或存储,这些重复项中的一些实际上不是重复项。这些副本通常也不会造成任何问题。
    在某些情况下,重复确实会导致问题,并且它们通常是由于隐式操作或 MariaDB 命令的宽松策略而出现的。有一些方法可以控制此问题、查找重复项、删除重复项和防止重复创建。
  • 策略和工具

    有四种管理重复项的关键方法 -
    • 用 JOIN 钓到它们,用临时表删除它们。
    • 使用 INSERT...ON DUPLICATE KEY UPDATE 在发现重复项时进行更新。
    • 使用 DISTINCT 修剪 SELECT 语句的结果并删除重复项。
    • 使用 INSERT IGNORE 停止插入重复项。

    将 Join 与临时表一起使用

    只需像内部连接一样执行半连接,然后删除使用临时表找到的重复项。
  • 使用插入

    当 INSERT...ON DUPLICATE KEY UPDATE 发现重复的唯一键或主键时,它会执行更新。在发现多个唯一键时,它只更新第一个。因此,不要在具有多个唯一索引的表上使用它。
    查看以下示例,该示例揭示了在插入填充字段时包含索引值的表中发生的情况 -
    
    INSERT INTO add_dupl VALUES (1,'Apple');
    ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
    
    注意- 如果找不到键,则 INSERT...ON DUPLICATE KEY UPDATE 语句会像正常的插入语句一样执行。
  • 使用 DISTINCT

    DISTINCT 子句从结果中删除重复项。DISTINCT 子句的一般语法如下 -
    
    SELECT DISTINCT fields
    FROM table
    [WHERE conditions];
    
    注意- 带有 DISTINCT 子句的语句的结果 -
    • 使用一个表达式时,它会为其返回唯一值。
    • 使用多个表达式时,它返回唯一的组合。
    • 它不会忽略 NULL 值;因此,结果也包含 NULL 作为唯一值。
    使用单个表达式的 DISTINCT 子句查看以下语句 -
    
    SELECT DISTINCT product_id
    FROM products
    WHERE product_name = 'DustBlaster 5000';
    
    使用多个表达式查看以下示例 -
    
    SELECT DISTINCT product_name, product_id
    FROM products
    WHERE product_id < 30
    
  • 使用插入忽略

    INSERT IGNORE 语句指示 MariaDB 在发现重复记录时取消插入。查看下面给出的使用示例 -
    
    mysql> INSERT IGNORE INTO customer_tbl (LN, FN)
       VALUES( 'Lex', 'Luther');
    
    另外,请注意重复背后的逻辑。根据表数据的性质,某些表需要重复。在管理重复记录的策略中满足这一需求。