`
zl198751
  • 浏览: 278426 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

数据库级联更新和删除

阅读更多

如果a(id,name)表为主表。

b(id, a_id, name)表为从表,b.a_id外键关联到a_id。

那么如果需要更新a.id或者删除a的数据,且在b表中有数据关联到需要更新或者删除的a表纪录,那么普通的更新必然会有外键冲突。

 

解决方法如下:

Mysql

在b表中创建delete cascade, update cascade.

 

user表:
create table user
(
userid integer not null auto_increment primary key,
username varchar(12) not null
)
type=innodb;

password表:
create table password
(
userid integer not null,
password varchar(12) not null,
index (userid),
foreign key (userid) references user (userid)
on delete cascade
on update cascade
)
type=innodb;

1、MySQL支持外键约束,并提供与其它DB相同的功能,但表类型必须为 InnoDB
2、建外键的表的那个列要加上index.

 


Oracle

在b表中创建delete cascade.

关于级联更新需要添加trigger,当更新a.id的同时更新b.a_id.

参考trigger学习:http://zheng12tian.iteye.com/blog/838200

trigger:

create or replace trigger a_id_update after update on venue for each row
begin
  if :new.id != :old.id THEN
    update b set a_id=:new.id where a_id=:old.id;
  end if;
end;

 此种tirgger只能解决更新单条a记录的更新。

 

SQL 10G>select * from a;   
        id
----------
         1
         2
         3
 

SQL 10G>select * from b;
        a_id
----------
         1
         2
         3

 

>update a set id=id+1;

错误结果

SQL 10G>select *from a;
        P1
----------
         2
         3
         4
SQL 10G>select * from b;
        F1
----------
         4
         4
         4
参考:http://wzwanghai.spaces.live.com/blog/cns!56626E237AFBD116!270.entry
可以看到f表的记录变成 了三4,显然这不是我们想要的结果,单父表这边把1更新成2,子表也相应把1变成2,这时候子表就有2个2了,然后父表把2更新成3,子表更新两个2成 3,这时候子表就有三个3了,当父表把3更新成4,子表会把三个3都更新成4,也就是最后我们看到的结果,这显然是不符合需求的。我们除了限制父表的多条 记录更新外还有什么办法呢?

分享到:
评论

相关推荐

    mysql级联更新和级联删除

    MySQL中的级联更新和级联删除功能为数据库提供了强大的数据完整性保障机制。通过合理配置外键约束及其相关选项,可以有效避免数据不一致的问题。在实际应用中,应根据业务需求选择合适的策略,并注意测试各种边界...

    用JDBC实现数据库的级联删除与更新

    根据给定文件的信息,本文将围绕“用JDBC实现数据库的级联删除与更新”这...通过以上设计和实现,我们能够有效地利用 JDBC 进行数据库的级联删除与更新操作。这种设计不仅简化了代码逻辑,还提高了系统的稳定性和效率。

    hibernate many-to-many级联保存,级联更新,级联删除

    例如,如果我们希望在Student与Course的Many-to-Many关系中启用级联保存和更新,可以在映射文件中这样配置: ```xml <!-- 在Student.hbm.xml --> <!-- 在Course.hbm.xml --> ``` 四、级联保存 假设我们有一个...

    Oracle数据库中的级联查询、级联删除、级联更新操作教程

    Oracle数据库中的级联查询、级联删除和级联更新是数据库设计中常用的操作,它们用于在多表关联的关系型数据库中实现数据的联动处理。在Oracle中,这些操作主要涉及外键约束和触发器。 首先,级联查询是通过自连接来...

    sql数据库省市区表级联文件

    数据库级联更新/删除 在描述中提到的“省市区表级联文件”,可以推测这个文件是关于如何在数据库中建立省、市、区之间的关系,并通过级联操作来实现数据的一致性管理。 - **级联更新**:当父表中的某个字段值发生...

    mybatis关联/级联以及动态sql

    MyBatis支持级联保存、更新和删除。这可以通过在Mapper接口的方法上使用`@Cascade`注解或者在XML映射文件中使用`<cascade>`标签来实现。 接着,我们来看动态SQL。动态SQL是MyBatis的一个强大特性,它允许我们在SQL...

    SQL 级联删除与级联更新的方法

    因此,在设计数据库时,应谨慎使用级联删除和更新。 2. 级联操作可能导致意外的数据丢失,因此在生产环境中,确保有备份策略以防止错误操作。 3. 使用级联操作时,应确保所有相关表的事务处理和回滚逻辑都能正确...

    LINQ通过外键级联添加和删除数据库的示例

    注意,级联删除需要在数据库的外键约束上设置,这通常在数据库设计阶段完成。在SQL Server中,可以通过`ON DELETE CASCADE`选项设置。 这个示例项目`WebSite2`应该包含了相关的代码文件、数据库文件以及运行示例的...

    级联删除笔记【自用0分】

    级联删除和级联更新是数据库管理中非常重要的概念,特别是在多表关联的情况下,能够确保数据的一致性和完整性。本文将详细介绍如何在SQL Server中实现级联更新和级联删除,包括通过触发器的方式和使用外键约束的方式...

    Hibernate 一对多、多对一、级联、加载、反转

    在Java持久化框架Hibernate中,一对多(One-to-Many)、多对一(Many-to-One)、级联(Cascading)、加载(Loading)和反转(Inversing)是关系映射的重要概念,它们对于理解如何在数据库和对象之间有效地管理关联至...

    实验五数据库编程:包括触发器、级联更新删除和系统函数等

    本次实验的主要目标在于让学生深入了解并掌握数据库编程中的几个关键概念和技术,包括但不限于: 1. **常见系统函数的使用方法**:学习如何利用数据库内置的各种系统函数来处理数据,如日期处理、字符串操作等。 2....

    qt实现sqlite3级联删除demo

    在数据库管理中,级联删除是一种常见的功能,它允许在删除一个表中的记录时,自动删除与之相关联的其他表中的记录。在Qt环境下,结合SQLite3数据库,我们可以实现这一功能。Qt是一个跨平台的C++库,提供了丰富的GUI...

    MySQL使用外键实现级联删除与更新的方法

    通过级联删除和更新,我们可以简化数据库的维护工作,保证数据的同步性。但是,这种操作也需谨慎,因为它可能导致大量数据的连锁反应,可能会影响到数据库的性能。 总结来说,MySQL中的外键和级联操作是数据库设计...

    Hibernate的级联操作(增,删,该)

    在这个例子中,父实体的`childEntity`属性将执行全部级联操作,包括添加、删除和更新,同时`delete-orphan`意味着如果从父实体的集合中移除了子实体,那么这个子实体也将被从数据库中删除。 6. 性能与最佳实践 级联...

    世界各国城市级联数据库,有英文,精确到区域

    使用这个数据库,开发者需要具备SQL技能来查询、插入、更新和删除数据。 在压缩包子文件的文件名称“travel_area.sql”中,“travel”可能是指这个数据库与旅行或地理信息相关,“area”则对应描述中的“精确到区域...

    SQL server创建触发器实现级联删除

    通常情况下,数据库管理系统支持外键约束来实现级联删除。但是,在某些场景下,可能由于历史遗留问题或者其他原因,无法直接使用外键约束。此时,可以通过创建触发器来手动实现这一功能。 #### 四、触发器实现级联...

    存储过程-游标-级联删除

    在数据库管理中,级联删除是一种常见的操作,它涉及到一个表中的记录被删除时,与之关联的其他表中的记录也会自动被删除。在大型数据库系统中,这种功能通常通过外键约束来实现,但在某些情况下,如需要自定义删除...

    MSserver自关联表的级联删除

    在上述标题和描述中提到的MS Server自关联表的级联删除,主要通过触发器来实现。触发器是一种特殊的存储过程,它会在特定的数据库操作(如INSERT、UPDATE或DELETE)发生时自动执行。这里创建了一个名为`DelSection`...

Global site tag (gtag.js) - Google Analytics