如前面的課程所討論的,MariaDB在某些情況下允許重復(fù)記錄和表。 由于不同的數(shù)據(jù)或?qū)ο箢?lèi)型,或作為操作對(duì)象的唯一壽命或存儲(chǔ)的結(jié)果,這些重復(fù)中的一些事實(shí)上不是重復(fù)的。 這些副本通常也沒(méi)有問(wèn)題。
在某些情況下,重復(fù)確實(shí)會(huì)導(dǎo)致問(wèn)題,并且它們常常由于隱式動(dòng)作或MariaDB命令的寬松策略而出現(xiàn)。 有多種方法可以控制此問(wèn)題,查找重復(fù)項(xiàng),刪除重復(fù)項(xiàng),并防止重復(fù)創(chuàng)建。
有四個(gè)關(guān)鍵方法來(lái)管理重復(fù) -
使用JOIN關(guān)聯(lián),并用臨時(shí)表刪除他們。
使用INSERT ... ON DUPLICATE KEY UPDATE在發(fā)現(xiàn)重復(fù)時(shí)更新。
使用DISTINCT修剪SELECT語(yǔ)句的結(jié)果并刪除重復(fù)的。
使用INSERT IGNORE停止插入重復(fù)項(xiàng)。
只需像內(nèi)部聯(lián)接那樣執(zhí)行半連接,然后刪除使用臨時(shí)表找到的重復(fù)。
當(dāng)INSERT ... ON DUPLICATE KEY UPDATE發(fā)現(xiàn)重復(fù)的唯一或主鍵時(shí),它執(zhí)行更新。 發(fā)現(xiàn)多個(gè)唯一鍵時(shí),它只更新第一個(gè)。 因此,不要在具有多個(gè)唯一索引的表上使用它。
查看以下示例,該示例顯示在插入到填充字段時(shí)在包含索引值的表中發(fā)生的情況 -
INSERT INTO add_dupl VALUES (1,'Apple'); ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
注意 - 如果沒(méi)有找到任何鍵,INSERT ... ON DUPLICATE KEY UPDATE語(yǔ)句的執(zhí)行方式與正常的insert語(yǔ)句相似。
DISTINCT子句從結(jié)果中刪除重復(fù)項(xiàng)。 DISTINCT子句的一般語(yǔ)法如下 -
SELECT DISTINCT fields FROM table [WHERE conditions];
注 - 帶有DISTINCT子句的語(yǔ)句的結(jié)果 -
當(dāng)使用一個(gè)表達(dá)式時(shí),它為它返回唯一的值。
當(dāng)使用多個(gè)表達(dá)式時(shí),它返回唯一的組合。
它不會(huì)忽略NULL值; 因此,結(jié)果還包含NULL作為唯一值。
使用單個(gè)表達(dá)式的DISTINCT子句查看以下語(yǔ)句 -
SELECT DISTINCT product_id FROM products WHERE product_name = 'DustBlaster 5000';
使用多個(gè)表達(dá)式查看以下示例 -
SELECT DISTINCT product_name, product_id FROM products WHERE product_id < 30
INSERT IGNORE語(yǔ)句指示MariaDB在發(fā)現(xiàn)重復(fù)記錄時(shí)取消插入。 查看下面給出的使用示例 -
mysql> INSERT IGNORE INTO customer_tbl (LN, FN) VALUES( 'Lex', 'Luther');
另外,注意重復(fù)的邏輯。 某些表基于表數(shù)據(jù)的性質(zhì)需要重復(fù)。 滿足您在管理重復(fù)記錄的策略中的需要。
更多建議: