Mariadb 简明教程

MariaDB - Managing Duplicates

如前文所讨论的,MariaDB 在某些情况下允许重复记录和表。由于不同的数据或对象类型,或者由于操作对象的独特寿命或存储,其中一些重复实际上并不是重复的。这些重复通常也不会有问题。

在某些情况下,重复确实会造成问题,并且它们经常是由隐式操作或 MariaDB 命令的宽松策略引起的。有方法可以控制此问题,查找重复项,删除重复项并阻止创建重复项。

Strategies and Tools

有四种关键方法可以管理重复项 -

  1. 使用 JOIN 找出它们,然后使用临时表删除它们。

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

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

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

Using Join with a Temporary Table

只需执行类似于内联连接的半连接,然后使用临时表删除找到的重复项。

Using INSERT

当 INSERT…​ON DUPLICATE KEY UPDATE 发现重复唯一或主键时,它会执行更新。当发现多个唯一键时,它只会更新第一个键。因此,不要在具有多个唯一索引的表上使用它。

复习以下示例,它揭示了在向已填入字段中插入索引值时表中发生的情况 -

INSERT INTO add_dupl VALUES (1,'Apple');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

Note - 如果它找不到键,则 INSERT…​ON DUPLICATE KEY UPDATE 语句将像普通插入语句一样执行。

Using DISTINCT

DISTINCT 子句从结果中删除重复项。DISTINCT 子句的一般语法如下 -

SELECT DISTINCT fields
FROM table
[WHERE conditions];

Note - 带有 DISTINCT 子句的语句的结果 -

  1. 当使用一个表达式时,它将返回该表达式的唯一值。

  2. 当使用多个表达式时,它将返回唯一组合。

  3. 它不会忽略 NULL 值;因此,结果也包含 NULL 值作为唯一值。

使用 DISTINT 从句对单一表达式查看以下语句 -

SELECT DISTINCT product_id
FROM products
WHERE product_name = 'DustBlaster 5000';

使用多个表达式查看以下示例 -

SELECT DISTINCT product_name, product_id
FROM products
WHERE product_id < 30

Using INSERT IGNORE

ON DUPLICATE KEY IGNORE 语句指示 MariaDB 在发现重复记录时取消插入。查看下面给出的示例 -

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

同样,注意重复背后的逻辑。某些表基于该表数据的特性需要重复记录。在管理重复记录的策略中满足该需求。