万维读者网>世界军事论坛>跟帖
刚试了一个入门级的数据库设计问题,答案不对。不知道是不是我没说清楚
送交者: 渔樵闲话 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.00%(0) 0.00%(0) 0.00%(0)
当前新闻共有0条评论
笔  名 (必选项):
密  码 (必选项):
注册新用户
标  题 (必选项):
内  容 (选填项):