当前位置: 首页 > 面试题库 >

设置表关系“ Cascade”,“ Set Null”和“ Restrict”做什么?

王景山
2023-03-14
问题内容

我想开始在新项目中使用表关系。

经过一番搜索之后,我将2个表设置为InnoDB:

我要链接的键是

->用户->用户ID(主要)->会话->用户ID(索引)

在此过程中,我唯一不了解的是“更新时”和“删除时”的不同设置做了什么

这里的选项是:

  • - (没有?)
  • 级联(???)
  • 设置为空(将所有内容设置为空吗?)
  • 不采取行动(嗯…)
  • 限制 (???)

我基本上希望在用户完全删除后删除会话中的数据,这是因为仅当我的会话管理器检测到到期时,才删除会话。

因此,如果有人可以告诉我这些选项的作用,将不胜感激。


问题答案:

CASCADE将在父项更改时传播更改。(如果删除行,则约束表中引用该行的行也将被删除,等等。)

SET NULL 当父行消失时,将列值设置为NULL。

RESTRICT 导致尝试删除父行失败。

编辑:您没有询问它们,但是SQL标准定义了另外两个操作:SET DEFAULTNO ACTION。在MySQL中,NO ACTION等效于RESTRICT。(在某些DBMS中,这NO ACTION是一个延迟检查,但是在MySQL中,所有检查都是立即执行的。)MySQL解析器接受SET DEFAULT,但是InnoDB和NDB引擎均拒绝这些语句,因此SET DEFAULT实际上不能用于ON UPDATEor或ON DELETE约束。

另外,请注意,级联外键操作不会激活MySQL中的触发器。



 类似资料:
  • 问题内容: 我已经阅读了许多有关级联和多对多关联的主题,但是我无法找到我的特定问题的答案。 我在UserProfiles和Roles之间有多对多关系。当我删除UserProfile时,我希望数据库删除联接表(userprofile2role)中的关联记录,因此要使用实际的SQL’ON DELETE CASCADE’操作。这可能吗?无论我尝试什么,Hibernate总是在不指定ON DELETE行为

  • 我对Django非常熟悉,但最近注意到在_delete=models上存在一个和选项, > 我已搜索了相同的文档,但除了以下内容外,找不到其他内容: Django 2.0 多对一的关系。需要两个位置参数:与模型相关的类和on_delete选项。要创建递归关系(一个与自身具有多对一关系的对象),请使用models.ForeignKey('self',on_delete=models.CASCADE)

  • 问题内容: 如何通过MySQL和PHP 进行设置? 我的代码: 问题答案: 除了修复/ gotcha之外,还可以通过要求数据库在查询中每年仅返回一次来保存数组查找,并使代码更简单: (您可能不需要假设这是一个数字年份,但是始终将HTML模板中包含的任何纯文本都用HTML转义是一种很好的做法。您可以定义一个名称较短的函数来减少输入。)

  • lazy 查询数据的时候,有些字段并不需要返回。这样能够节省内存,而且取数据的速度会更快一些。 虽然BuguQuery查询中的方法returnFields()和notReturnFields(),可以指定查询的时候返回、不返回哪些字段,但如果每次查询的时候都要特别指定,那会非常麻烦。有没有简便一点的方法呢?用lazy属性即可实现。 @Property、@Embed、@EmbedList都有lazy

  • Node-restrict 能够阻止应用程序使用 procss.binding('process_wrap'), process.kill 和 child_process 的 Nodejs 模块。 代码示例: var restrict = require('restrict');// ls is whitelistedrestrict({    'whitelist': ['ls'],    'w

  • 问题内容: 如何在Swift 的子类中将对象添加到关系属性中? 在Objective-C中,当您从数据模型以Xcode 生成子类时,会自动生成一个包含以下声明的类扩展: 但是,Xcode当前缺少Swift类的此类生成功能。 如果我尝试直接在Swift对象上调用等效方法: …我在方法调用中遇到编译器错误,因为这些生成的访问器不可见。 如文档中所述,我已将Relationship属性声明为。 还是我必