MariaDB - 管理重复项

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

另外,请注意重复项背后的逻辑.某些表需要基于该表数据的性质进行重复.满足管理重复记录的策略需求.