- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在开发一个数据库,用于跟踪项目中的文件和依赖项。简而言之,我有两个主表; PROJECTS 表列出项目名称和其他属性,FILES 表列出文件。每个文件条目都指向一个项目,作为外键设置为 CASCADE,因此如果我从数据库中删除一个项目记录,所有文件记录也会消失。到目前为止,还不错。
现在我有一个额外的 DEPENDENCIES 表。依赖表中的每条记录都是两个文件,指定第一个文件依赖于第二个文件。同样,这些是外键,第一个设置为 CASCADE(因此,如果我删除一个文件条目,则该记录将被删除),但第二个设置为 RESTRICT(如果有任何其他文件依赖,则不允许我删除文件条目在上面)。同样,一切似乎都很好。
不幸的是,我似乎无法再使用单个 SQL 删除语句删除项目!删除尝试级联删除文件,但如果其中任何一个出现在 DEPENDENCIES 表中,RESTRICT 外键会阻止删除(即使依赖项表中的该记录将被删除,因为另一列是 CASCADE)。我唯一的解决方法是计算删除文件的确切顺序,这样就不会违反任何依赖项记录约束,并在尝试删除项目之前一次删除一个文件记录。
有什么方法可以设置我的数据库架构,以便从项目表中删除单个 SQL 可以正确地级联其他删除吗?我使用的是 Firebird 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
中的行,因此所有剩余文件都是免费的的依赖关系。您删除项目现在可以级联删除这些文件。
我还没有测试过这个,我的 Firebird 语法可能生锈了,但也许它会让你开始。
显然,请在您的数据副本而不是实时数据上进行测试!
关于sql - 冲突的 CASCADE 和 RESTRICT 外键要求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/353804/
在 NHibernate 中创建条件时我可以使用 Restriction.In() 或 限制.InG() 它们有什么区别? 最佳答案 InG 是 In 的通用等价物(对于集合) 方法的签名如下(仅显示
我创建了一个 Hibernate (3.5) 条件查询: Criteria criteria = db.getSession().createCriteria(Vendor.class); crite
我对这个指令定义对象感到困惑 - (restrict)。我创建了两个函数,第一个是带有 restrict 的函数,另一个是没有 restrict 的函数。 当我运行此代码时,两个指令返回相同的结果。
这些陈述是否相同?如果我删除 owl:Restriction 会有什么问题吗?和 owl:Class .它们似乎多余,但这总是我在网上看到的例子。 owl:onProperty有域名owl:restr
下面是我开发的表格 create table userevent(id uuid,eventtype text,sourceip text,user text,sessionid text,rolei
这个问题已经有答案了: Access restriction on class due to restriction on required library rt.jar? (15 个回答) Acce
方法说明: Given a list of futures fs, returns the future holding the list of values of all the futures f
我想知道是否可以将 restrict 关键字仅包含在函数定义中,而不是像这样的函数声明中: void foo(char *bar); void foo(char * restrict bar) {
Advertisements advertisements = NHibernateSession.CreateCriteria(typeof(Advertisements))
我有以下结构: typedef struct{ int data[LENGTH]; }Data; 并像这样使用它: Data* dt=CALLOC(...) int foo(Data* res
我有以下结构: typedef struct{ int data[LENGTH]; }Data; 然后像这样使用它: Data* dt=CALLOC(...) int foo(Data* re
有以下结构: typedef struct test_def { int a, b, c; } test_def_t; typedef struct test { test_def_t con
我阅读了标准但仍然不能确定: #include #include void repl(char *restrict ap){ char *cp=strchr(ap,(int)'m');
我注意到在我们的一个遗留项目中大量使用了 restrict 关键字。 我理解 restrict 的基本原理,但我质疑它在应用于其中一些功能时是否有用。 举下面两个例子: void funcA(int
我有以下简单的功能 static inline void minVec(const double *restrict v, double *restrict vmin, unsigned length
添加到 C99 中的 restrict 关键字的主要用途之一是允许编译器将某些内容加载到寄存器中,并假定该寄存器将反射(reflect)如此加载的变量的状态。给定 void foo1(int * re
RESTRICT 和 NO ACTION 在 MySQL FK 中有什么区别?从文档来看,它们似乎完全相同。是这样吗?如果有,为什么两者都有? 最佳答案 来自 MySQL 文档:https://dev
我有一些通过apply from: 'my-build.gradle'应用的Gradle脚本。如果我在外部构建文件my-build.gradle中按如下方式使用新的插件DSL,它将失败并显示以下错误:
我正在浏览 Wikipedia/Restrict , 并发现 The compiler can e.g. rearrange the code, first loading all memory lo
根据eslint no-restricted-imports documentation When using the object form, you can also specify an arr
我是一名优秀的程序员,十分优秀!