📜  MariaDB-管理重复项

📅  最后修改于: 2020-11-27 05:37:07             🧑  作者: Mango


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

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

策略与工具

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

  • 用JOIN为它们钓鱼,并用一个临时表删除它们。

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

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

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

对临时表使用联接

只需执行类似于内部联接的半联接,然后删除在临时表中发现的重复项即可。

使用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语句的方式与正常的insert语句相同。

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

另外,请注意重复项背后的逻辑。有些表根据该表数据的性质要求重复。适应您管理重复记录的策略中的需求。