我目前正在用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表,因此这也适用于我拥有的所有其他表。
谢谢。
我的问题是,有没有办法从该表中删除与该学生相关的数据?例如,如果我要在EmergencyContact表中包含一个列,该列将StudentID作为外键引用,如果从父表中删除了StudentID,则删除该行?这是解决这个特殊问题的好方法吗?
如果多个学生有相同的紧急联系,会发生什么?如果您不需要复制数据 - 这就是emergencyContactOf表的全部要点,您可以有效地设置学生和紧急联系人之间的多对多关系。所以你不想做你描述的事情。
您可以定期(每月,每年,在清除学生名单后,无论如何)运行删除,如果他们没有出现在emergencyContactOf中,则从emergencyContact中删除行:
DELETE FROM emergencyContact
WHERE emergencyID NOT IN (SELECT emergencyID FROM emergencyContactOf)
等等。
嗯,我在这里看到两个场景。如果两个学生有相同的紧急联系,说两个兄弟让他们的父亲作为紧急联系人怎么办?
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),
...);
第二种可能是诱人的,但“清洁方式”是第一种,因为第二种允许矛盾的数据。从你发布的内容来看,你已经处于“干净的道路”。但提到需要触发器。