版主:黑木崖
    
 · 九陽全新免清洗型豆漿機 全美最低
 
剛試了一個入門級的數據庫設計問題,答案不對。不知道是不是我沒說清楚
送交者: 漁樵閒話 2025月02月04日09:54:54 於 [世界軍事論壇] 發送悄悄話
回  答: 也別把AI吹那麼神。AI以前是被當笑話看的。 漁樵閒話 於 2025-02-04 06:09:34

對ON DELETE CASCADE的理解完全錯了。

image.png

為了滿足以下需求:

  1. 當用戶被刪除時,自動刪除相關地址;

  2. 當地址被刪除時,保留用戶。

我們可以設計一個關係數據庫,其中:

  • 用戶和地址之間的關係是一對多(一個用戶可以有一個辦公地址,但一個地址可以被多個用戶引用)。

  • 使用外鍵約束和 ON DELETE CASCADE 來實現用戶刪除時自動刪除地址。

  • 使用 ON DELETE SET NULL 來實現地址刪除時保留用戶,但取消用戶對地址的引用。

以下是詳細的設計:


1. 地址表 (Address)

這個表存儲地址信息,包括街道地址和郵政編碼。

列名數據類型約束條件
AddressIDINT主鍵,自增
StreetAddressVARCHAR非空
PostalCodeVARCHAR非空

SQL 創建語句:

sql
Copy
CREATE TABLE Address (     AddressID INT PRIMARY KEY AUTO_INCREMENT,     StreetAddress VARCHAR(255) NOT NULL,     PostalCode VARCHAR(20) NOT NULL);

2. 用戶表 (User)

這個表存儲用戶信息,包括用戶的名字和辦公地址。辦公地址是一個可選字段,因此可以為空。

列名數據類型約束條件
UserIDINT主鍵,自增
FirstNameVARCHAR非空
OfficeAddressIDINT外鍵,引用 Address.AddressID,可為空

SQL 創建語句:

sql
Copy
CREATE TABLE User (     UserID INT PRIMARY KEY AUTO_INCREMENT,     FirstName VARCHAR(100) NOT NULL,     OfficeAddressID INT,     FOREIGN KEY (OfficeAddressID) REFERENCES Address(AddressID) ON DELETE SET NULL);

3. 用戶-地址關係表 (UserAddress)

為了實現“當用戶被刪除時,自動刪除相關地址”,我們需要一個額外的表來管理用戶和地址之間的關係。這個表將記錄哪些地址是由用戶創建的。

列名數據類型約束條件
UserIDINT外鍵,引用 User.UserID,級聯刪除
AddressIDINT外鍵,引用 Address.AddressID,級聯刪除

SQL 創建語句:

sql
Copy
CREATE TABLE UserAddress (     UserID INT,     AddressID INT,     PRIMARY KEY (UserID, AddressID),     FOREIGN KEY (UserID) REFERENCES User(UserID) ON DELETE CASCADE,     FOREIGN KEY (AddressID) REFERENCES Address(AddressID) ON DELETE CASCADE);

4. 關鍵設計點

  1. 用戶刪除時自動刪除地址

    • 當用戶被刪除時,UserAddress 表中與該用戶相關的記錄會被自動刪除(由於 ON DELETE CASCADE)。

    • 由於 AddressID 在 UserAddress 表中被級聯刪除,相關的地址記錄也會被刪除。(錯了!)

  2. 地址刪除時保留用戶

    • 當地址被刪除時,User 表中的 OfficeAddressID 會被設置為 NULL(由於 ON DELETE SET NULL),從而取消用戶對地址的引用。

  3. 用戶和地址的關係

    • UserAddress 表用於記錄哪些地址是由用戶創建的,確保只有用戶創建的地址才會在用戶刪除時被級聯刪除。



0%(0)
0%(0)
標 題 (必選項):
內 容 (選填項):
實用資訊
北美最大最全的折扣機票網站
美國名廠保健品一級代理,花旗參,維他命,魚油,卵磷脂,30天退貨保證.買百免郵.