`

主键与外键的关系、级联保存、更新、删除

 
阅读更多

主键与外键的关系、级联保存、更新、删除

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)
比较原来的表可以发现它们的确已经更新成功了,测试完成!!!这也就实现了用外键对多个相关联的表做同时删除、更新的操作,从而保证了数据的一致性。 
 

 

分享到:
评论

相关推荐

    查询一个表的所有外键名称,主键名称,主键列ID,主键列名,外键表ID,外键列ID,外键列名

    查询一个表的所有外键名称,主键名称,主键列ID,主键列名,外键表ID,外键列ID,外键列名 级联更新,级联删除,索引名称,索引字段名,索引字段位置

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

    当你更新或删除主键表时,那么外键表也会跟随一起更新或删除,需要在建表时设置级联属性 CREATE TABLE Countries(CountryId INT PRIMARY KEY) INSERT INTO Countries (CountryId) VALUES (1) INSERT INTO Countries ...

    jaguar_orm:具有关系(一对一,一对多,多对多),预加载,级联,多态关系等的源生成的ORM

    具有关系(一对一,一对多,多对多),预加载,级联,多态关系等的源生成的ORM产品特点人际关系预载级联级联刀片级联更新级联清除移民多态关系复合主键复合外键入门声明模型class User { @PrimaryKey () String id;...

    MySQL 数据库的约束和表的关系

    目录MySQLI. 数据库的约束1. 概述2. 分类3. 主键约束 primary keya. 作用b. 语法c. 示例d. 主键与唯一非空4. 唯一约束 uniquea.... 外键的级联a. 作用b. 语法c. 示例 MySQL I. 数据库的约束 1. 概述 作用:对表

    MySQL外键使用详解

    最近有开始做一个实验室管理系统,因为分了几个表进行存储·所以要维护表间的关联··研究了一下MySQL的外键。 (1)只有InnoDB类型的表才...使用在外键关系的域必须与数据类型相似 (5)创建的步骤 指定主键关键字:

    第二章 关系数据库(二)

    关系完整性规则用于保证关系的主键与外键的取值必须是正确的和有效的。用户定义完整性是用户应用环境中需要遵循的特定约束条件,体现用户应用环境中特殊的业务规则。 1.实体完整性 主键的值必须是唯一的和确定的,...

    mysql数据库设计(1).pdf

    级联删除:ON DELETE CASCADE 数据库的设计 数据库的设计 1. 多表之间的关系 1. 分类: 1. ⼀对⼀(了解): 2. ⼀对多(多对⼀): 3. 多对多: 2. 实现关系: 1. ⼀对多(多对⼀): * 实现⽅式:在多的⼀⽅建⽴外键,...

    Juliette_Portfolio:数据分析组合

    我下载了Microsoft SQL,并在应用程序中运行了基本查询和中间查询 基本查询功能包括创建表,插入,选择和... 使用主键和外键,在删除集上设置为null以及在删除级联上创建的表 Insert语句包含2种方法:使用默认主键和

    数据库设计与优化.pdf

    我这里说的谨慎,是因为级联删除和级联更新有些突破了传统的关于外键的定义,功能有点 太过强大,使用前必须确定自己已经把握好 其功能范围,否则,级联删除和级联更新可能让你的数据莫名其妙 的被修改或者丢失。...

    Hibernate注解

    很奇怪),分别是CascadeType.PERSIST(级联新建),CascadeType.REMOVE(级联删除),CascadeType.REFRESH(级联刷新),CascadeType.MERGE(级联更新),CascadeType.ALL(全部四项) * 方法一 * 主表: ?@OneToOne...

    数据库完整性实验-完整代码.rar

    (8)创建一个级联删除触发器student_delete。要求:当从学生表中删除某学生信息时,同时删除score表中此学生相关的选课记录。 (9)创建一个触发器student_insert,实现功能:如果往学生表中插入数据,则自动修改...

    javaweb博客网站

    3.数据库没设计好,外键直接引用的主键属性,所以没做级联更新 4.其实这个项目是个团队作业,组员水平不一,所以写的简单,适合初学者学习,高手勿喷 5.sql文件我用的Navicat导出的,导入好像有点问题,自己改一改吧...

    一款包含系统设计和代码生成功能的自动化web平台

    6. 外键关联:在添加字段的时候,可以设置该字段是否外键,外键字段需要关联某个实体的主键,从而可以实现`一对一`或`一对多`关联。 7. 级联扩展:外键字段或多对多实体上可以配置级联字段,级联字段可以作为被关联...

    21天学通Oracle

    6.2.3 级联更新与级联删除 100 6.2.4 修改外键属性 102 6.2.5 外键使用 104 6.3 唯一性约束 105 6.3.1 唯一性约束简介 105 6.3.2 创建唯一性约束 105 6.3.3 修改唯一性约束 107 6.3.4 唯一性约束的使用 108 ...

    Asp.Net 网站优化系列之数据库优化分字诀上 分库

    说到这儿也许你会想到外键约束怎么办,我的博客表,论坛帖子表都有用了User表的主键做外键呀。这个很容易处理,我们需要当机立断的删掉外键,这个当机立断可能会带来一些麻烦,我们来分析下可能会遇到一些什么问题:...

    《SQL高级应用和数据仓库基础(MySQL版)》学习笔记 ·004【标识列、外键、复制表】

    文章目录一、标识列二、外键约束1、外键约束创建要求2、级联操作三、复制表 一、标识列 介绍 标识列,又称为自增列,可以不手动插入数值,系统提供默认的序列值。 特点 标识列必须和一个key搭配(key:主键、唯一键...

    jdbc基础和参考

    delete:在删除当前对象的时候,级联删除和他相关联的对象 all: save-update+delete delete-orphan:解除关联关系时,删除和当前对象失去关联的对象 all-delete-orphan:all+delete-orphan 单向的一对多的关系,在进行...

    Hibernate3.1_学习源码

    其中数据库用到级联删除。配置文件分别用list、set和map元素配置第二张表。 07 07Hibernate_Mapping : Hibernate中的数据关联技术,是一个重点又是一个难点,演示了 一对一、多对一、一对多、多对多等几种情况。

    数据库系统原理实验大纲.doc

    熟练掌握主键约束 熟练掌握外键约束 熟练掌握UNIQUE约束 熟练掌握空值约束 理解CHECK约束的作用 掌握增、删、改被参照关系主键值时,对参照关系产生影响的几种策略,如受限 删除、级联删除、置空等策略。...

Global site tag (gtag.js) - Google Analytics