冲突的CASCADE和限制外国关键要求?
-
20-08-2019 - |
题
我正在跟踪的项目文件和依赖的数据库。简单地说,我有两个主表;项目表列出的项目名称和其他属性,文件表列出的文件。每一个文件入口点的项目作为一个外键设置为CASCADE,所以如果我从数据库中删除一个项目的记录,所有的文件记录消失为好。到目前为止,一切都很好。
现在我有一个额外的依赖表。在依赖表中的每个记录是两个文件,指定的第一个文件依赖于第二。同样,这些都是外键,第一个设置为CASCADE(所以如果我删除一个文件条目,该记录被删除),但第二个被设置为限制功能(所以我不允许删除一个文件条目,如果任何其他文件依赖在上面)。再次,一切似乎都不错。
不幸的是,似乎我再也无法删除一个项目,一个SQL语句删除!删除尝试级联删除的文件,但如果任何这些出现在依赖关系表中,限制外国键防止删除(即使在依赖表中的记录将被删除,因为另一列是CASCADE)。我唯一的解决方法是计算精确的顺序删除所以没有依赖的记录限制被违反的文件,并试图删除该项目之前删除的文件记录一次一个。
有什么办法来建立我的数据库架构,以便单个SQL从项目表中删除将正确的级联删除其他?我使用的是火鸟2.1,但我不知道是否有什么差别? - 好像,就必须有一种方法,使这项工作。
解决方案
您无法通过级联外键控制缺失的顺序,但你可以设计上PROJECTS
触发删除属于该项目FILES
行和在DEPENDENCIES
也被列为依赖于其他FILES
。使其成为BEFORE DELETE
触发,所以它的级联效应之前应执行。
像这样:
CREATE TRIGGER Del_Child_Files FOR PROJECTS
BEFORE INSERT
AS BEGIN
FOR SELECT F.FILE_ID FROM FILES F JOIN DEPENDENCIES D
ON F.FILE_ID = D.CHILD_ID
WHERE F.PROJECT_ID = OLD.PROJECT_ID
INTO :file_id
DO
DELETE FROM FILES WHERE FILE_ID = :file_id;
DONE
END
所以,当你删除一个项目,这将删除一个项目依赖于其他文件的所有“子”的文件,而这个级联删除行中DEPENDENCIES
使所有剩余的文件都是免费的依赖。你的项目删除现在可以级联删除这些文件。
我没有测试过这一点,我的火鸟语法可能生锈,但也许它会让你开始。
显然,请在您的数据,而不是实时数据的拷贝测试这个!
其他提示
是否为系统支持延迟约束,其中所述约束检查可以推迟到下一个提交点?
也许这虽然只是一个Oracle的事情。