我有两个A和B类,从A到B有多对一的关系(多个A对象可以引用相同的B).问题是,如果A侧的删除规则是Cascade,则仅在删除最后一个引用A 时才删除B,或者在第一次删除关联的A 时删除B. 如果重要的话,关系B侧的删除规则是Nullify.
另外,我在核心数据文档中读到,在某些情况下,Optional标志很重要.但目前尚不清楚他们所说的关系与我的案例有何关系.他们在讨论收容案(B由A拥有),而我的案例是订阅/关联(B与A有关).
我可以简单地在代码中管理删除programmaticaly,但是如果可能的话,我希望允许Core Data做正确的事情.但目前尚不清楚Core Data中是否支持我正在寻找的垃圾收集语义.
有什么建议?
你好,我有一个问题,我需要在指向同一个表的多个外键上级联..
[Insights]
| ID | Title |
| 1 | Monty Python |
| 2 | Spamalot |
[BroaderInsights_Insights]
| broaderinsight_id | insight_id |
| 1 | 2 |
Run Code Online (Sandbox Code Playgroud)
基本上,当洞察表中的一个或两个记录被删除时,我需要删除该关系.
我试过这个:
CREATE TABLE broader_insights_insights(id INT NOT NULL IDENTITY(1,1),
broader_insight_id INT NOT NULL REFERENCES insights(id) ON DELETE CASCADE,
insight_id INT NOT NULL REFERENCES insights(id) ON DELETE CASCADE,
PRIMARY KEY(id))
Go
Run Code Online (Sandbox Code Playgroud)
这导致警告级联"可能导致循环或多个级联路径"
所以我尝试添加一个级联到insight_id,这导致:
"DELETE语句与REFERENCE约束冲突"
有任何想法吗?
谢谢
丹尼尔
假设以下"模式/关系"设计,使用级联删除操作删除处理删除的推荐做法是什么?
关系模式:
+---------+ +--------+ | Student |-*--------1-[Enrollment]-1--------*-| Course | +---------+ +--------+
MongoDB的:
+---------+ +--------+ | Student |-*----------------*-| Course | +---------+ +--------+
考虑到学生的课程招生的这一经典设计,具有学生,反之亦然课程集合似乎使用MongoDB的(即没有为关系/报名表)时是合适的数据模型.但是来自关系世界我应该如何处理删除课程的语义?也就是说,当删除课程时,也应删除所有"注册"记录.也就是说,我应该从每个学生记录的集合中删除该课程.看起来我必须触发2个查询:一个用于删除课程,然后从每个学生的集合中删除它.有没有办法让单个查询执行这种"级联删除",如语义而无需额外的查询?数据模型是否需要更改?
注意:对于所有其他用例,上述数据模型工作正常:
=>
只会删除该学生以及随之删除的相关课程集.=>
的学生只需将其从学生课程集中删除即可=>
只是将其添加到相应的"表格"中.唯一棘手的事情是处理删除课程.我应该如何处理MongoDB中的这种情况,因为我来自关系背景,我无法弄清楚这一点.
database database-design non-relational-database mongodb cascading-deletes
我正在创建一个自定义评论系统,可以使用contenttypes GenericForeignKey将评论附加到任何模型.
class Comment(models.Model):
body = models.TextField(verbose_name='Comment')
user = models.ForeignKey(User)
parent = models.ForeignKey('self', null=True, blank=True)
created = models.DateTimeField(auto_now_add=True)
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
Run Code Online (Sandbox Code Playgroud)
我的理解是,当附加注释的模型被删除时,删除应该级联并删除注释.
不幸的是,这没有发生,我很难过.是否有任何常见原因可以更改默认删除行为?
django foreign-keys cascading-deletes django-contenttypes generic-foreign-key
我正在使用EF4 CTP 5,CodeFirst.
请先看我的课程:
public class Guest
{
[Key]
public Guid GuestID { get; set; }
public Language PreferredLanguage { get; set; }
public Guid? LanguageID { get; set; }
}
public class Language
{
[Key]
public Guid LanguageID { get; set; }
[Required(ErrorMessage = "Enter language name")]
[StringLength(50, ErrorMessage = "Language name is too long")]
public string LanguageName { get; set; } // in origine language
}
Run Code Online (Sandbox Code Playgroud)
我的目标是为访客语言关系设置一定的"删除规则".删除语言时,我不想删除相应的guest虚拟机(因此无级联删除).相反,我希望客人的LanguageID为"Set NULL".
我希望流利的API在这里支持我.但我找不到任何有用的东西.WillCascadeOnDelete(bool),它不提供我需要的选项.我错过了什么吗?或者这只是在CTP 5中没有实现?
谢谢你的帮助!
我的models.py
文件包含:
class User(models.Model):
email = models.CharField(max_length=100, unique=True)
password = models.CharField(max_length=100)
create_time = models.DateTimeField(auto_now_add=True)
class Session(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
token = models.CharField(max_length=100, unique=True)
Run Code Online (Sandbox Code Playgroud)
当我命令python manage.py makemigrations
然后命令python manage.py sqlmigrate <app_name> <migration_name>
我没有看到任何说"ON DELETE = CASCADE"
但是,当我键入时,迁移工作没有失败python manage.py migrate
.
现在,如果我转到mysql表(使用SequelPro)并尝试为当前有会话条目的用户删除一行,我会收到以下错误:" 未删除一行.重新加载表格以确保在此期间内容没有改变.检查控制台是否有可能在此表的主键内发生错误! ".
现在,当我转到会话表并删除该用户的会话,然后尝试从用户表中删除用户的行时,它会正确删除.这表明ON DELETE = CASCADE
实际上并没有在MySQL级别工作.
我怎么能纠正它?
使用以下相关模型(一个博客条目可以有多个修订版):
class BlogEntryRevision(models.Model):
revisionNumber = models.IntegerField()
title = models.CharField(max_length = 120)
text = models.TextField()
[...]
class BlogEntry(models.Model):
revisions = models.ManyToManyField(BlogEntryRevision)
[...]
Run Code Online (Sandbox Code Playgroud)
如何在删除BlogEntryRevision
相应的内容时告诉Django删除所有相关的s BlogEntry
?如果删除了"其他"端的对象,则默认似乎是将对象保持为多对多关系.有什么方法可以做到这一点 - 最好不要超越BlogEntry.delete
?
我可以知道数据库是否DELETE ON CASCADE
包含查询吗?
假设我有这两个非常基本的实体:
public class ParentEntity
{
public int Id;
public virtual ICollection<ChildEntity> Childrens;
}
public class ChildEntity
{
public int Id;
public int ParentEntityId; // Foreign Key
public virtual ParentEntity parent; // [NOTWANTED]
}
Run Code Online (Sandbox Code Playgroud)
出于某些原因,我不希望ChildEntity将引用保留回其父级.我只是希望它保留ParentEntity id,但仅此而已.到目前为止,没问题,我只是删除[NOTWANTED]行,一切都按预期工作.
我的问题是:如何在特定情况下禁用级联删除?
如果我仍然拥有父导航属性,那将很容易:
modelBuilder.Entity<ChildEntity>()
.HasRequired(c => c.parent)
.WithMany(p => p.Childrens)
.WillCascadeOndelete(false)
Run Code Online (Sandbox Code Playgroud)
但是如果没有导航属性,我不知道如何在删除时禁用级联(当然不是全局禁用它,也不是每个表都禁用它,而只是为了关系).
我现在所做的是将外键设置为可以为空的int,以便在删除时禁用级联,但这并不漂亮:
public int? ParentEntityId; // Foreign Key - nullable just to disable cascade on delete
Run Code Online (Sandbox Code Playgroud)
如何才能使用流畅的API?认为它应该是可能的.
c# entity-framework foreign-keys cascading-deletes ef-code-first
在MySQL Workbench中,如何在关系上设置级联删除?
我点击了关系线并点击了属性,但我没有看到任何提及级联删除选项.
django ×3
foreign-keys ×3
mysql ×3
database ×2
sql ×2
c# ×1
cascade ×1
cocoa ×1
cocoa-touch ×1
constraints ×1
core-data ×1
iphone ×1
many-to-many ×1
mongodb ×1
python ×1
sql-server ×1