MariaDB - 管理重複資料



如之前課程中所述,MariaDB 在某些情況下允許重複記錄和表。一些重複資料實際上並非重複,因為它們具有不同的資料或物件型別,或者由於操作物件的唯一生命週期或儲存而導致。這些重複資料通常也不會造成任何問題。

在某些情況下,重複資料確實會導致問題,並且它們通常是由於隱式操作或 MariaDB 命令的寬鬆策略而出現。有一些方法可以控制這個問題,查詢重複資料,刪除重複資料,以及防止重複資料的建立。

策略和工具

有四種主要方法可以管理重複資料:

  • 使用 JOIN 查詢它們,並使用臨時表刪除它們。

  • 使用 INSERT...ON DUPLICATE KEY UPDATE 在發現重複資料時進行更新。

  • 使用 DISTINCT 修剪 SELECT 語句的結果並刪除重複資料。

  • 使用 INSERT IGNORE 停止插入重複資料。

使用 JOIN 和臨時表

只需執行類似於內部聯接的半聯接,然後使用臨時表刪除找到的重複資料。

使用 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 語句會像正常的插入語句一樣執行。

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

此外,請注意重複資料背後的邏輯。某些表需要重複資料,具體取決於該表資料的性質。在管理重複記錄的策略中考慮這一需求。

廣告