我目前正在用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表,因此这也将适用于我拥有的所有其他表。
谢谢。
答案 0 :(得分:0)
嗯,我在这里看到两种情况。如果两个学生有相同的紧急联系人,比如说两个麻烦让父亲作为紧急联系人,该怎么办?
您使用的方法不太复杂,紧急联系人表中的多行可以映射到现实生活中的一个人。在这种情况下,您可以将对学生的引用直接拉到紧急联系表中,然后在其中使用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)
之类的。