查询SQLite和级联外键

问题描述 投票:0回答:2

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

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表中删除数据,因为ParentID表中将不再出现StudentID键。

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

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

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

谢谢。

sql database sqlite c#-4.0 cascade
2个回答
0
投票

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

如果多个学生有相同的紧急联系,会发生什么?如果您不需要复制数据 - 这就是emergencyContactOf表的全部要点,您可以有效地设置学生和紧急联系人之间的多对多关系。所以你不想做你描述的事情。

您可以定期(每月,每年,在清除学生名单后,无论如何)运行删除,如果他们没有出现在emergencyContactOf中,则从emergencyContact中删除行:

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

等等。


0
投票

嗯,我在这里看到两个场景。如果两个学生有相同的紧急联系,说两个兄弟让他们的父亲作为紧急联系人怎么办?

  1. 如果在这种情况下您只在紧急联系表中存储一条记录(父亲),则只要其中一条记录离开,您就不想删除紧急联系人。您将删除另一个的紧急联系人。因此,您需要其他逻辑,何时删除紧急联系人。你可以把它放在一个触发器中。
  2. 您使用不太复杂的方法,紧急联系表中的多行可以映射到现实生活中的一个人。在这种情况下,您可以将对学生的引用直接拉入紧急联系表,并在那里使用ON DELETE CASCADECREATE 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), ...);

第二种可能是诱人的,但“清洁方式”是第一种,因为第二种允许矛盾的数据。从你发布的内容来看,你已经处于“干净的道路”。但提到需要触发器。

© www.soinside.com 2019 - 2024. All rights reserved.