MariaDB - 管理重复数据



如之前课程中所述,MariaDB 在某些情况下允许重复记录和表。一些重复数据实际上并非重复,因为它们具有不同的数据或对象类型,或者由于操作对象的唯一生命周期或存储而导致。这些重复数据通常也不会造成任何问题。

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

策略和工具

有四种主要方法可以管理重复数据:

  • 使用 JOIN 查找它们,并使用临时表删除它们。

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

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

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

使用 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');

此外,请注意重复数据背后的逻辑。某些表需要重复数据,具体取决于该表数据的性质。在管理重复记录的策略中考虑这一需求。

广告