Mysql

外鍵設置

  • August 24, 2021

我將首先提到我對數據庫非常陌生。我在 MySQL 工作。

誰能給我一個外行的看法,即何時使用外鍵選項的哪些設置,以便何時使用 On Delete:Cascade,On Delete:Set Null,On Delete:No Action。此外,這些在橋接表中的外鍵意義上是如何工作的,它是否取決於數據庫的上下文,如它包含的數據,或者是否有一般的經驗法則來確定哪種設置在這種類型的關係?

如果可以的話,請簡單說明一下,因為我對行話並不完全熟悉,因為我是一個相對新手。非常感謝

可以在不知道任何事情FOREIGN KEYs並且根本不使用數據庫的情況下使用數據庫。我建議你以這種方式開始。

AFOREIGN KEY做了三件事:

  • 這是一個約束。如果您嘗試從一張桌子連結到另一張桌子而沒有合適的行,它會打你的手。可以將其想像為填寫一份需要您的家庭住址的表格,但您輸入錯誤並且您輸入的地址沒有房子。如果您從不打錯字,則不需要該檢查。
  • 它提供了一個索引(又名“鍵”)來進行上述檢查。但是您可以根據需要創建索引而無需 FK。如果每個表只有幾百行,您可能不會注意到您錯過了索引的顯著性能優勢。索引就像電話簿。(如果你還太小還不知道電話簿是什麼,那就去博物館吧。)
  • 它可以“級聯”事物。不要使用那個;自己做吧。我指的是刪除一個表中的一行會自動導致刪除另一個表中的相應行。類比:當一個人去世時,需要手動通知 DMV、選民登記、銀行等,以便他們可以從他們的名單中刪除該人。FK 有助於自動發生這種情況。

既然你提到了一個橋接表,我會朝那個方向漫談。(聽起來你可能已經掌握了。)“實體”之間的“關係”有 3 種類型:

  • 1:1——不要用那個。為什麼要麻煩讓兩張桌子步調一致,而一張桌子會這樣做。(有例外;但那是在另一堂課中。)
  • 1:many——這只是通過一個表中的連結(“id”)來實現,以允許“JOINing”到另一個表。第一個表的許多行連結到第二個表中的單行。
  • many:many – 這有很多名字,“橋接”在其中一個上。在大學範例中:students:classes、classes:teachers 等。橋接需要一個額外的表。請參閱此以獲得最佳索引:http: //mysql.rjweb.org/doc.php/index_cookbook_mysql#many_to_many_mapping_table

這些映射中的任何一個都可以退化為 1 或 0。

亂跑…

SELECT ... FROM tableA JOIN tableB ON ...

提供顯示在兩個表中的行(基於ON條件)。

SELECT ... FROM tableA LEFT JOIN tableB ON ...

傳遞表 A 的所有行,無論表 B 中是否存在匹配行。如果不存在,則應該來自表 B 的列將是NULLs

說明這些ON表格是如何“相關”的。

WHERE子句(如果存在)過濾掉一些行。

假設您有一張使用者表和一張照片表,並且照片有一個外鍵列引用user_id對應於使用者表中每個使用者的唯一 ID 的外鍵列。

使用ON DELETE CASCADE - 當您在照片仍在引用使用者時刪除使用者時,它也會刪除照片。

使用ON DELETE SET NULL - 已刪除使用者的照片表的外鍵列的行將設置為NULL,因為使用者的唯一 ID 不再存在,因為您刪除了他們。

那麼我們想在哪裡使用它呢?好吧,如果使用者要創建某種資源並且由於某種原因您刪除了該使用者,但您仍想顯示底層照片,這可能非常有用。也許您需要刪除有問題的使用者,但這些文章可能是有意義的,因此即使您刪除了這些事情所依賴的其他記錄,您也可能希望保留這些記錄。

引用自:https://dba.stackexchange.com/questions/271522