我有2个表:T1和T2,它们是带有数据的现有表.我们在T1和T2之间有一对多的关系.当删除T1中的记录时,如何更改表定义以在SQL Server中执行级联删除,T2中的所有关联记录也将被删除.
他们之间存在外来约束.我不想删除表或创建触发器来删除T2.例如,当我删除员工时,所有审核记录也应该消失.
T1 - 员工,
Employee ID
Name
Status
Run Code Online (Sandbox Code Playgroud)
T2 - 性能评测,
Employee ID - 2009 Review
Employee ID - 2010 Review
Run Code Online (Sandbox Code Playgroud) 我试图做一个简单的例子,以便学习如何从父表中删除一行,并使用Doctrine2自动删除子表中的匹配行.
这是我正在使用的两个实体:
Child.php:
<?php
namespace Acme\CascadeBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="child")
*/
class Child {
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="Father", cascade={"remove"})
*
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="father_id", referencedColumnName="id")
* })
*
* @var father
*/
private $father;
}
Run Code Online (Sandbox Code Playgroud)
Father.php
<?php
namespace Acme\CascadeBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="father")
*/
class Father
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
}
Run Code Online (Sandbox Code Playgroud)
这些表是在数据库上正确创建的,但是没有创建On Delete Cascade选项.我究竟做错了什么?
我对JPA 2.0 orphanRemoval
属性有点困惑.
当我使用JPA提供程序的数据库生成工具创建底层数据库DDL以获得ON DELETE CASCADE
特定关系时,我想我可以看到它是必需的.
但是,如果数据库存在并且它已经存在ON DELETE CASCADE
关系,那么这还不足以级联删除吗?什么是orphanRemoval
除了做?
干杯
在PostgreSQL 8中,是否可以ON DELETE CASCADES
在不丢弃后者的情况下添加到下表中的两个外键?
# \d scores
Table "public.scores"
Column | Type | Modifiers
---------+-----------------------+-----------
id | character varying(32) |
gid | integer |
money | integer | not null
quit | boolean |
last_ip | inet |
Foreign-key constraints:
"scores_gid_fkey" FOREIGN KEY (gid) REFERENCES games(gid)
"scores_id_fkey" FOREIGN KEY (id) REFERENCES users(id)
Run Code Online (Sandbox Code Playgroud)
两个引用的表都在下面 - 这里:
# \d games
Table "public.games"
Column | Type | Modifiers
----------+-----------------------------+----------------------------------------------------------
gid | integer | not null default nextval('games_gid_seq'::regclass)
rounds | integer | …
Run Code Online (Sandbox Code Playgroud) postgresql cascade constraints cascading-deletes postgresql-8.4
有什么区别
@OneToMany(cascade=REMOVE, mappedBy="customer")
public List<Order> getOrders() { ... }
Run Code Online (Sandbox Code Playgroud)
和
@OneToMany(mappedBy="customer", orphanRemoval="true")
public List<Order> getOrders() { ... }
Run Code Online (Sandbox Code Playgroud)
这个例子来自Java EE Tutorial,但我仍然不了解细节.
CoreData
CoreData
使用级联删除规则,实体"A"与条目"B" 的集合具有一对多的关系.
在iCloud
环境中,当设备1显示"B"条目之一的详细视图时,设备2删除"A"条目.
当NSPersistentStoreDidImportUbiquitousContentChangesNotification
在设备1中接收到通知时,其App Delegate调用mergeChangesFromContextDidSaveNotification
然后广播内部通知,该内部通知由视图控制器捕获,显示条目"B"的细节(代码使用performBlock
它应该的位置).
但是,尽管当详细视图控制器接收到内部通知时,条目"A"确实无效,但条目"B"仍然作为有效CoreData
对象存在.似乎Cascade规则尚未完成其运作.因此,设备1中的视图控制器不知道删除,这可能导致意外的结果.
mergeChangesFromContextDidSaveNotification
当基础数据已合并但Cascade规则尚未完成时,似乎过早地返回.
我在通知到达时尝试刷新条目"B",同时暂时将stalenessInterval
托管对象上下文设置为零,因此不会使用缓存对象,但我仍然从商店获得有效条目"B".
此时检查null
条目"A"不是一个选项,因为情况比我在此描述的情况稍微复杂一些,并且空条目"A"在某些情况下可能有效.
我尝试在合并更改之后和将内部通知发送到视图控制器之前引入延迟.我发现2秒延迟没有帮助,但延迟10秒有效.
但我不想依赖这种延迟.这是一个没有太多数据的测试环境,我不知道在生产环境中会发生什么.依靠实验性延迟似乎不是正确的做法.
有没有正确的事情?或者我开始做错了什么?
我想删除包含外键的行,但是当我尝试这样的事情时:
DELETE FROM osoby WHERE id_osoby='1'
Run Code Online (Sandbox Code Playgroud)
我得到这个声明:
错误:表"osoby"上的更新或删除违反表"kontakty"上的外键约束"kontakty_ibfk_1"DETAIL:键(id_osoby)=(1)仍然从表"kontakty"引用.
如何删除这些行?
上面两个选项有什么区别?什么时候最好选择每个选项?
Django模型通常可以非常充分地处理ON DELETE CASCADE行为(以适用于本机不支持它的数据库的方式).
但是,我在努力发现在不适合的情况下覆盖此行为的最佳方法是什么,例如在以下场景中:
ON DELETE RESTRICT(即如果有子记录,则阻止删除对象)
ON DELETE SET NULL(即不删除子记录,但将其父键设置为NULL而不是断开关系)
删除记录时更新其他相关数据(例如删除上传的图像文件)
以下是我所知道的实现这些目标的潜在方法:
覆盖模型的delete()
方法.虽然这种方法有效,但是当通过a删除记录时,它会被回避QuerySet
.此外,delete()
必须重写每个模型,以确保Django的代码永远不会被调用,super()
并且无法调用,因为它可能使用a QuerySet
来删除子对象.
使用信号.这似乎是理想的,因为在直接删除模型或通过QuerySet删除时会调用它们.但是,不可能阻止删除子对象,因此无法实现ON CASCADE RESTRICT或SET NULL.
使用正确处理此问题的数据库引擎(在这种情况下Django会做什么?)
等到Django支持它(直到那时还有bug ...)
似乎第一种选择是唯一可行的选择,但它很难看,用洗澡水将婴儿扔出去,并且当添加新的模型/关系时可能会遗漏某些东西.
我错过了什么吗?有什么建议?
在Julie Lerman的Pluralsight"Entity Framework 5入门"课程的"Code First Modeling"部分之后,我创建了两个POCO类,其中包含一对一或零关系:父(User)和可选孩子(UserDetail).
请注意,图中UserId属性是UserDetail的主键和外键.
相关代码:
public class User
{
//...
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
/* Has a 1:0..1 relationship with UserDetail */
public virtual UserDetail UserDetail { get; set; }
//...
}
public class UserDetail
{
//...
/* Has a 0..1:1 relationship with User */
public virtual User User { get; set; }
[Key, ForeignKey("User")]
public int UserId { get; set; …
Run Code Online (Sandbox Code Playgroud) c# entity-framework cascading-deletes ef-code-first entity-framework-5
cascade ×3
jpa ×2
postgresql ×2
symfony ×2
c# ×1
constraints ×1
core-data ×1
django ×1
doctrine ×1
doctrine-orm ×1
foreign-keys ×1
hibernate ×1
icloud ×1
ios ×1
java ×1
jpa-2.0 ×1
php ×1
sql ×1
sql-server ×1