MariaDB - 管理重复项

如前几课所述,MariaDB 在某些情况下允许重复记录和表格。 由于不同的数据或对象类型,或者由于操作对象的唯一生命周期或存储,这些重复中的一些实际上不是重复。 这些重复项通常也不会造成任何问题。

在某些情况下,重复项确实会导致问题,并且它们经常由于隐式操作或 MariaDB 命令的宽松政策而出现。 有一些方法可以控制此问题、查找重复项、删除重复项以及防止创建重复项。


策略和工具

有四种管理重复项的关键方法 −

  • 使用 JOIN 来获取它们,并使用临时表删除它们。

  • 使用 INSERT...ON DUPLICATE KEY UPDATE 在发现重复项时进行更新。

  • 使用 DISTINCT 修剪 SELECT 语句的结果并删除重复项。

  • 使用 INSERT IGNORE 停止插入重复项。

使用 Join 和临时表

简单的像inner join一样进行semi-join,然后用一个临时表去掉发现的重复。


使用 INSERT

当 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

INSERT IGNORE 语句指示 MariaDB 在发现重复记录时取消插入。 查看下面给出的使用示例 −

mysql> INSERT IGNORE INTO customer_tbl (LN, FN)
   VALUES( 'Lex', 'Luther');

另外,请注意重复项背后的逻辑。 根据表数据的性质,某些表需要重复项。 在管理重复记录的策略中满足这种需求。