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 fieldsFROM 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');
另外,请注意重复项背后的逻辑.某些表需要基于该表数据的性质进行重复.满足管理重复记录的策略需求.