主键与外键的关系、级联保存、更新、删除
http://www.alixixi.com/ePrint.asp?from=dev&id=34852
正文:
--建立数据库
create database test;
go
--建立表customers
create table customers(
id int identity(1,1) not null,
name varchar(15),
age int,
primary key(id)
);
go
--建立表orders
create table orders(
id int identity(1,1) not null,
order_number varchar(15),
price money,
customer_id int,
primary key(id)
);
go
--对表orders插入数据,以检测money数据类型,结果为:69.0000
insert into orders(price) values(69);
select * from orders;
--增加外键与关系约束
alter table orders add constraint FK_CUSTOMER foreign key (customer_id) references customers(id);
go
--级联删除、更新
alter table orders add constraint FK_CUSTOMER foreign key (customer_id) references customers(id)
on delete cascade on update cascade;
go
--级联删除
alter table orders add constraint FK_CUSTOMER foreign key (customer_id) references customers(id)
on delete cascade;
go
=====================================================================================================
--
insert into customers values('张三',25);
insert into customers values('李四',25);
--如果设置了级联插入,那么在向子表orders插入的customer_id(外键)
--必须在父表customers中存在此id(主键)
insert into orders values(1,50,5);
--如果设置了级联删除,删除父表customers中id=5的记录,
--也会删除子表orders中customer_id=5的记录,
delete from customers where id=5
--查询
select * from customers;
select * from orders
SQL主键和外键的删除规则说明
http://www.hake.cc/a/shujuku/mssql/2011/0918/21683.html
SQL表中经常包含外键关系,删除一个表的数据就会影响其他的表,下面将为您介绍SQL主键和外键的删除规则说明,供您参考,希望对您有所帮助。
删除规则和更新规则:
指定当数据库的最终用户尝试删除或更新某一行,而该行包含外键关系所涉及的数据时所发生的情况。
如果设置为:
无操作:当在删除或更新主键表的数据时,将显示一条错误信息,告知用户不允许执行该删除或更新操作,删除或更新操作将会被回滚。
层叠:删除或更新包含外键关系中所涉及的数据的所有行。
说明:“层叠”在SQL server 2000中又叫“级联”。
设置空:这是SQL server 2005新增的功能。如果表的所有外键列都可以接受空值,则将该值设置为空。
说明:要将外键的删除规则和更新规则设为“设置空”,则该外键必须是可以为空的字段。
设置默认值:这是SQL server 2005新增的功能。如果表的所有外键列都已定义了默认值,则将该值设置为该列定义的默认值。
说明:要将外键的删除规则和更新规则设置为“设置默认值”,该外键必须是有默认值的字段。
附加:
SQLServer2005
http://blog.sina.com.cn/s/blog_707a4cbf0100qz6c.html
表T_Device:
DeviceID(主键)
TypeID(外键,引用到T_Type表的TypeID字段)
表T_Type:
TypeID(主键)
如图:
在表设计器里面T_Device表的TypeID字段右键单击,弹出菜单上选择关系,如图:
在弹出的外键关系对话框中的INSERT和UPDATE规范中
更新规则:层叠(默认为无操作)
删除规则:层叠(默认为无操作)
可以实现级联操作
如图:
这时删除表T_Type表中的一条记录,会自动删除T_Device表中对应的记录集,例如如下关系:
T_Device:
DeviceID TypeID
1 3
2 1
3 1
4 2
5 1
T_Type:
TypeID
1
2
3
删除T_Type表中TypeID为1的记录的时候,T_Device表中的对应的TypeID为1的记录集都会被删除。
下面的理解是错误的:
删除T_Device表中的一条记录会对应删除T_Type表中对应的记录,例如,删除T_Device表中TypeID为3的那条记录,会级联删除T_Type表中的TypeID为3的记录。
这种理解的错误在于,如果删除T_Device表中TypeID为1的一条记录(如语句delete from table T_Device where DeviceID = 2),那么如果对应的T_Type表中的TypeID为1的记录被删除了,则T_Device表中DeviceID为3和5的记录对应的TypeID就失效了,这样破坏了外键关联的正确性。
这种理解错误的根源在于没有搞清楚外键两边谁是引用,谁是实体,也没有搞清楚级联删除的意义在于删除实体的时候级联的删除其所有引用的问题。
在上述例子中对于T_Device表来讲,T_Type表中的记录为实体,T_Device表中的TypeID字段为引用。
另外,外键约束保证了数据的逻辑完整性,级联操作只适用于主表(或被引用表)的删除(delete)和更新(Update)操作,
不适用于从表(或引用表)的插入(Insert)操作,因此不要想象如下代码可以被执行:
insert into T_Device values(1,3); 错错错,这个是可以执行的,实例验证
T_Type表里面只要有相应的数据就可以执行
如果认为在T_Device表中插入一条记录的同时,在T_Type表中会插入相应的被关联到T_Device表的记录是不对的,因为如果再执行insert into dev values(2,3);会如何呢?T_Type表中难道会存在两条TypeID为3的记录吗,这样违背了主键唯一性,因此做插入操作只能是先插入主表(或被引用表),然后插入从表(引用表)。
保存的时候先保存T_Type表,记得一定要保存表,否则主键个外键关系实际是没有创建的
MySQL中利用外键实现级联删除、更新
http://linghongli.iteye.com/blog/649796
MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引。在创建索引的时候,可以指定在删除、更新父表时,对子表进行的相应操作,包括RESTRICT、NO ACTION、SET NULL和CASCADE。其中RESTRICT和NO ACTION相同,是指在子表有关联记录的情况下父表不能更新;CASCADE表示父表在更新或者删除时,更新或者删除子表对应记录;SET NULL则是表示父表在更新或者删除的时候,子表的对应字段被SET NULL。
因为只有InnoDB引擎才允许使用外键,所以,我们的数据表必须使用InnoDB引擎。我所使用的版本是Mysql5.1版本的,过程如下:
创建数据库:
Create database test;
创建两个表,其中第一个表的”id”是第二个表(userinfo)的外键:
CREATE TABLE `user` (
`id` int(4) NOT NULL,
`sex` enum('f','m') DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `userinfo` (
`sn` int(4) NOT NULL AUTO_INCREMENT,
`userid` int(4) NOT NULL,
`info` varchar(20) DEFAULT NULL,
PRIMARY KEY (`sn`),
KEY `userid` (`userid`),
CONSTRAINT `userinfo_ibfk_1` FOREIGN KEY (`userid`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
注意:
1、存储引擎必须使用InnoDB引擎;
2、外键必须建立索引;
3、外键绑定关系这里使用了“ ON DELETE CASCADE ” “ON UPDATE CASCADE”,意思是如果外键对应数据被删除或者更新时,将关联数据完全删除或者相应地更新。更多信息请参考MySQL手册中关于InnoDB的文档;
好,接着我们再来插入数据测试:
INSERT INTO `user` (`id`,`sex`)
VALUES ('1', 'f'), ('2', 'm'), ('3', 'f');
INSERT INTO `userinfo` (`sn`,`userid`,`info`)
VALUES ('1', '1', '2005054dsf'),
('2', '1', 'fdsfewfdsfds'),
('3', '1', 'gdsgergergrtre'),
('4', '2', 'et34t5435435werwe'),
('5', '2', '435rtgtrhfghfg'),
('6', '2', 'ret345tr4345'),
('7', '3', 'fgbdfvbcbfdgr'),
('8', '3', '45r2343234were'),
('9', '3', 'wfyhtyjtyjyjy');
我们先看一下当前数据表的状态:
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| user |
| userinfo |
+----------------+
2 rows in set (0.00 sec)
User表中的数据:
mysql> select * from user;
+----+------+
| id | sex |
+----+------+
| 1 | f |
| 2 | m |
| 3 | f |
+----+------+
3 rows in set (0.00 sec)
Userinfo表中的数据:
mysql> select * from userinfo;
+----+--------+-------------------+
| sn | userid | info |
+----+--------+-------------------+
| 1 | 1 | 2005054dsf |
| 2 | 1 | fdsfewfdsfds |
| 3 | 1 | gdsgergergrtre |
| 4 | 2 | et34t5435435werwe |
| 5 | 2 | 435rtgtrhfghfg |
| 6 | 2 | ret345tr4345 |
| 7 | 3 | fgbdfvbcbfdgr |
| 8 | 3 | 45r2343234were |
| 9 | 3 | wfyhtyjtyjyjy |
+----+--------+-------------------+
9 rows in set (0.00 sec)
对于建立以上不表,相信对大家也没什么难度了。好的,下面我们就要试验我们的级联删除功能了。
我们将删除user表中id为2的数据记录,看看userinf表中userid为2的相关子纪录是否会自动删除:
执行删除操作成功!
mysql> delete from `user` where `id`='2';
Query OK, 1 row affected (0.03 sec)
看看user表中已经没有id为2的数据记录了!
mysql> select * from user;
+----+------+
| id | sex |
+----+------+
| 1 | f |
| 3 | f |
+----+------+
2 rows in set (0.00 sec)
再看看userinfo表中已经没有userid为2的3条数据记录了,对应数据确实自动删除了!
mysql> select * from userinfo;
+----+--------+----------------+
| sn | userid | info |
+----+--------+----------------+
| 1 | 1 | 2005054dsf |
| 2 | 1 | fdsfewfdsfds |
| 3 | 1 | gdsgergergrtre |
| 7 | 3 | fgbdfvbcbfdgr |
| 8 | 3 | 45r2343234were |
| 9 | 3 | wfyhtyjtyjyjy |
+----+--------+----------------+
6 rows in set (0.00 sec)
更新的操作也类似,因为我们在前面建表的时候已经定义外键删除、更新操作都是CASCADE,所以在这里可以直接测试数据。
将user表中原来id为1的数据记录更改为id为4,执行如下:
mysql> update user set id=4 where id='1';
Query OK, 1 row affected (0.03 sec)
Rows matched: 1 Changed: 1 Warnings: 0
现在去看看两个表中是数据是否发生了变化:
mysql> select * from user;
+----+------+
| id | sex |
+----+------+
| 3 | f |
| 4 | f |
+----+------+
2 rows in set (0.00 sec)
mysql> select * from userinfo;
+----+--------+----------------+
| sn | userid | info |
+----+--------+----------------+
| 1 | 4 | 2005054dsf |
| 2 | 4 | fdsfewfdsfds |
| 3 | 4 | gdsgergergrtre |
| 7 | 3 | fgbdfvbcbfdgr |
| 8 | 3 | 45r2343234were |
| 9 | 3 | wfyhtyjtyjyjy |
+----+--------+----------------+
6 rows in set (0.00 sec)
比较原来的表可以发现它们的确已经更新成功了,测试完成!!!这也就实现了用外键对多个相关联的表做同时删除、更新的操作,从而保证了数据的一致性。
发表评论
-
Android中SQLiteOpenHelper类的onUpgrade方法的作用
2012-02-09 11:50 4601Android中SQLiteOpenHelper类的onUpg ... -
在线升级Android应用程序的思路
2012-02-07 11:34 880在线升级Android应用程序的思路 http://www. ... -
Android数据库内容变化的监听
2012-02-07 11:31 6033Android数据库内容变化的监听 首先介绍内容监 ... -
android中的数据库操作
2012-02-07 10:50 1451android中的数据库操作 ... -
SQLiteOpenHelper类与自动升级数据库
2012-02-07 10:31 2283SQLiteOpenHelper类与自动升级数据库 S ... -
SQLite外键的实现
2012-02-07 10:30 1717SQLite外键的实现 SQLite现在的版本还不支持 ... -
29日修改数据库设计
2012-01-29 15:24 0数据表设计: 账号信息表account ... -
最新数据库设计
2012-01-28 21:21 0数据表设计: 工资管理 账号信息表Acc ... -
数据库设计
2012-01-11 15:27 0数据库设计 信息表:infotypecreate ta ... -
cmd下操作mysql
2011-12-20 14:11 987cmd下操作mysql 连接mysql服务器 mysql ... -
你能说出SQL聚集索引和非聚集索引的区别吗?
2011-12-07 15:18 0你能说出SQL聚集索引和非聚集索引的区别吗? http ... -
打造自己的数据访问层
2011-12-07 15:01 1287打造自己的数据访问层 http://database. ... -
MySQL数据库新特性之存储过程入门教程
2011-12-07 14:38 893MySQL数据库新特性之存储过程入门教程 http:/ ... -
论MySQL何时使用索引,何时不使用索引
2011-12-07 14:03 935论MySQL何时使用索引, ... -
详细讲解如何将数据模型转换成数据库设计
2011-12-07 12:42 1122详细讲解如何将数据模 ... -
讲解SQL与Oracle外键约束中的级联删除
2011-12-07 12:33 0讲解SQL与Oracle外键约束中的级联删除 当代 ... -
SQLite-CREATE TRIGGER
2011-12-07 09:07 1369SQLite-CREATE TRIGGER http: ... -
MySQL 数据类型
2011-12-06 10:18 793MySQL 数据类型 数值类型 MySQL 的数 ... -
MyISAM InnoDB 区别
2011-12-02 17:03 767MyISAM InnoDB 区别 http://www.ph ... -
事务的原理
2011-12-02 17:01 1272(1):事务(Transaction)是 ...
相关推荐
"MySQL 中利用外键实现级联删除、更新" 在 MySQL 中,外键是指在一个表中的一列或多列,引用另一个表中的主键或唯一索引。外键可以强制实施数据的一致性和完整性,使得数据更加可靠。外键在 MySQL 中的实现主要是...
同时,外键约束也可以控制级联操作,如级联删除或级联更新,使得当主键表中的数据发生变化时,关联的外键表中的数据能够相应地更新或删除。 总的来说,主键和外键在数据库设计中起着至关重要的作用,它们确保了数据...
### SQL存在检测、建库、建表、约束、外键、...综上所述,通过这些SQL语句,我们可以实现数据库的创建、表的构建、各种约束的应用以及外键与级联删除等功能,从而构建出一个结构合理、数据完整且易于维护的数据库系统。
### SQL 存在检测、建库、建表、约束、外键、级联删除知识点解析 #### 一、SQL 存在检测 在 SQL 语言中,存在检测主要用于判断某个对象(如数据库、表等)是否存在,从而决定是否执行后续的操作。这在创建或删除...
外键约束还可以设置级联操作,如级联删除或级联更新,这会使得当主键表中的记录被删除或更新时,所有引用该主键的外键记录也会相应地进行删除或更新。 主键和外键的区别主要体现在它们的功能和约束上。主键是表内的...
本文将深入探讨如何在Hibernate中处理Many-to-Many关系的级联保存、级联更新和级联删除。 一、Many-to-Many关系基础 在数据库设计中,Many-to-Many关系意味着两个实体之间存在多对多的关系。例如,学生可以选修多门...
注意,级联删除需要在数据库的外键约束上设置,这通常在数据库设计阶段完成。在SQL Server中,可以通过`ON DELETE CASCADE`选项设置。 这个示例项目`WebSite2`应该包含了相关的代码文件、数据库文件以及运行示例的...
查询一个表的所有外键名称,主键名称,主键列ID,主键列名,外键表ID,外键列ID,外键列名 级联更新,级联删除,索引名称,索引字段名,索引字段位置
### MySQL级联更新与级联删除详解 在数据库设计中,外键约束是维护数据完整性和一致性的重要手段之一。MySQL的InnoDB存储引擎支持多种不同的处理外键的方式,包括级联更新(Cascade Update)和级联删除(Cascade ...
此外,根据业务需求,还可以设置级联操作,比如当主表中的记录被删除时,是否自动删除关联的子表记录。 总结来说,Access中的外键关系是实现表间关联的关键,它有助于数据管理,确保了数据的完整性和一致性。正确地...
根据给定文件的信息,本文将围绕“用JDBC实现数据库的级联删除与更新”这一主题进行深入探讨,包括理解需求、设计思路、具体实现步骤以及相关代码示例。 ### 1. 需求理解 #### 1.1 业务场景 在本案例中,存在两个...
外键不仅可以用于限制数据插入,还可以实现级联操作,如级联删除和更新。在MySQL中,设置外键级联删除和更新的选项是在创建外键时指定`ON DELETE CASCADE`和`ON UPDATE CASCADE`。 例如: ```sql ALTER TABLE news_...
- `CASCADE`:删除或更新主表的记录时,会级联删除或更新子表中相关记录。 - `SET NULL`:主表记录被删除或更新时,子表相应外键字段设为NULL(如果允许NULL)。 - `NO ACTION` 或 `RESTRICT`:阻止对主表的删除...
类似于单主键带外键的情况,但在双主键实体中,外键可能与主键的一部分或全部相关联。`DepartNcBean`实体的`ncBean`和`deptDialogBean`构成主键,同时`badType`字段是一个外键。这里同样使用了`<many-to-one>`标签...
在实际操作中,建立外键时还需要考虑其他一些因素,例如更新或删除某条记录时,是否需要级联删除或更新其他表中引用了此记录的数据,以及是否允许将引用的字段置为NULL或者设置默认值等等。正确使用外键不仅可以维护...
外键约束是表之间关系的一种强定义方式,可以直接控制数据的级联更新和级联删除行为。 #### 创建外键约束示例 假设我们有两个表`A`和`C`,其中`C`表有一个字段`AID`与`A`表的主键`AID`关联。 ```sql ALTER TABLE ...
在这个例子中,`Cities`表的`CityID`是主键,`Regions`表的`CityID`是外键,两者建立了级联关系。 在应用程序开发中,如Web应用或桌面应用,前端和后端需要协同工作来实现二级级联的效果。前端负责展示和处理用户...
- SET NULL:如果允许,主键表中的记录被删除或更新时,引用表中对应的外键字段会被设为NULL。 - NO ACTION:如果尝试违反约束,操作会被回滚,不做任何改变。 4. 解决外键约束问题 - 避免循环引用:当两个表...
在SQL数据库设计中,级联操作(如级联删除和级联更新)是一种重要的关系维护机制,它确保了数据的一致性和完整性。级联操作主要应用于具有外键约束的表之间,当对主键表进行操作时,相关联的外键表会自动按照预设...