有关SQLite和级联外键的查询

时间:2018-09-11 17:40:11

标签: sql database sqlite c#-4.0 cascade

我目前正在用C#编写一个应用程序,该应用程序使用SQLite数据库存储用户将输入的信息。该应用程序基本上是一个针对应用程序中称为“学生”的用户的管理系统。这是我数据库中最重要的表,所有其他表都与该表链接。我想做的是当一个学生被撤离时(他们离开学院/被踢出学校等等),就是从所有其他表中删除他们的数据,以便不再需要这些数据。我编写的一些Create table语句的示例是:

CREATE TABLE student(studentID int(5) PRIMARY KEY NOT NULL, name string(16),...,DOB string(8) );

CREATE TABLE emergencyContact(emergencyID int(5) PRIMARY KEY NOT NULL, name string(16),..., contactNumber int(16));

CREATE TABLE emergencyContactOf(studentID int(5) FOREIGN KEY REFERENCES student('studentID'), emergencyID int(5) FOREIGN KEY REFERENCES emergencyContact('emergencyID');

我已经阅读了此书,并且我的理解是,如果我包含“ ON DELETE CASCADE”语句,则该数据将在EmergencyContactOf表中删除,因为StudentID密钥将不再出现在Parent表中。

但是,我的理解是,由于没有引用StudentID,因此不会删除该特定学生的EmergencyContact表中的数据。

我的问题是,有没有办法从该表中删除与该学生相关的数据?例如,如果我要在EmergencyContact表中包括一列,该列会将StudentID引用为外键,然后如果从父表中删除了StudentID,则删除该行?这是解决这个特定问题的好方法吗?

我拥有的所有其他表也是按照这种方式设计的,其中数据位于不同的表中,然后通过关系表链接回Student表,因此这也将适用于我拥有的所有其他表。

谢谢。

2 个答案:

答案 0 :(得分:0)

嗯,我在这里看到两种情况。如果两个学生有相同的紧急联系人,比如说两个麻烦让父亲作为紧急联系人,该怎么办?

  1. 在这种情况下,如果您仅在紧急联系人表中存储一条记录(父亲),那么如果其中只有一条离开,则您不想删除该紧急联系人。您将删除另一个联系人的紧急联系人。因此,当删除紧急联系人时,您将需要其他逻辑。您可以将其触发。
  2. 您使用的方法不太复杂,紧急联系人表中的多行可以映射到现实生活中的一个人。在这种情况下,您可以将对学生的引用直接拉到紧急联系表中,然后在其中使用ON DELETE CASCADE

    CREATE TABLE student
                 (studentid int(5),
                  name string(16),
                  ...
                  PRIMARY KEY (studentid),
                  ...);
    ...
    CREATE TABLE emergencycontact
                 (emergencycontactid int(5),
                  studentid int(5),
                  name string(16),
                  ...
                  PRIMARY KEY (emergencycontactid),
                  FOREIGN KEY (studentid)
                              REFERENCES student
                                         (studentid),
                  ...);
    

第二个可能很诱人,但“干净的方法”是第一个,因为第二个允许相互矛盾的数据。从您发布的内容来看,您已经处于“干净的方式”。但是提到那需要触发器。

答案 1 :(得分:0)

  

我的问题是,有没有办法从该表中删除与该学生相关的数据?例如,如果我要在EmergencyContact表中包括一列,该列会将StudentID引用为外键,然后如果从父表中删除了StudentID,则删除该行?这是解决这个特定问题的好方法吗?

如果多个学生具有相同的紧急联系人会怎样?如果不需要,您不需要复制数据-这是EmergencyContactOf表的重点,可以有效地在学生和紧急联系人之间建立多对多关系。因此,您不想做您描述的事情。

您可以定期(每月,每年,在清除学生名册之后,进行其他操作)运行删除操作,如果这些行未出现在EmergencyContactOf中,则将其从EmergencyContact中删除:

DELETE FROM emergencyContact
WHERE emergencyID NOT IN (SELECT emergencyID FROM emergencyContactOf)

之类的。