主键与外键的关系、级联保存、更新、删除
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 4560Android中SQLiteOpenHelper类的onUpg ... -
在线升级Android应用程序的思路
2012-02-07 11:34 819在线升级Android应用程序的思路 http://www. ... -
Android数据库内容变化的监听
2012-02-07 11:31 5989Android数据库内容变化的监听 首先介绍内容监 ... -
android中的数据库操作
2012-02-07 10:50 1408android中的数据库操作 ... -
SQLiteOpenHelper类与自动升级数据库
2012-02-07 10:31 2238SQLiteOpenHelper类与自动升级数据库 S ... -
SQLite外键的实现
2012-02-07 10:30 1655SQLite外键的实现 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 921cmd下操作mysql 连接mysql服务器 mysql ... -
你能说出SQL聚集索引和非聚集索引的区别吗?
2011-12-07 15:18 0你能说出SQL聚集索引和非聚集索引的区别吗? http ... -
打造自己的数据访问层
2011-12-07 15:01 1248打造自己的数据访问层 http://database. ... -
MySQL数据库新特性之存储过程入门教程
2011-12-07 14:38 853MySQL数据库新特性之存储过程入门教程 http:/ ... -
论MySQL何时使用索引,何时不使用索引
2011-12-07 14:03 903论MySQL何时使用索引, ... -
详细讲解如何将数据模型转换成数据库设计
2011-12-07 12:42 1081详细讲解如何将数据模 ... -
讲解SQL与Oracle外键约束中的级联删除
2011-12-07 12:33 0讲解SQL与Oracle外键约束中的级联删除 当代 ... -
SQLite-CREATE TRIGGER
2011-12-07 09:07 1313SQLite-CREATE TRIGGER http: ... -
MySQL 数据类型
2011-12-06 10:18 749MySQL 数据类型 数值类型 MySQL 的数 ... -
MyISAM InnoDB 区别
2011-12-02 17:03 732MyISAM InnoDB 区别 http://www.ph ... -
事务的原理
2011-12-02 17:01 1226(1):事务(Transaction)是 ...
相关推荐
查询一个表的所有外键名称,主键名称,主键列ID,主键列名,外键表ID,外键列ID,外键列名 级联更新,级联删除,索引名称,索引字段名,索引字段位置
当你更新或删除主键表时,那么外键表也会跟随一起更新或删除,需要在建表时设置级联属性 CREATE TABLE Countries(CountryId INT PRIMARY KEY) INSERT INTO Countries (CountryId) VALUES (1) INSERT INTO Countries ...
具有关系(一对一,一对多,多对多),预加载,级联,多态关系等的源生成的ORM产品特点人际关系预载级联级联刀片级联更新级联清除移民多态关系复合主键复合外键入门声明模型class User { @PrimaryKey () String id;...
目录MySQLI. 数据库的约束1. 概述2. 分类3. 主键约束 primary keya. 作用b. 语法c. 示例d. 主键与唯一非空4. 唯一约束 uniquea.... 外键的级联a. 作用b. 语法c. 示例 MySQL I. 数据库的约束 1. 概述 作用:对表
最近有开始做一个实验室管理系统,因为分了几个表进行存储·所以要维护表间的关联··研究了一下MySQL的外键。 (1)只有InnoDB类型的表才...使用在外键关系的域必须与数据类型相似 (5)创建的步骤 指定主键关键字:
关系完整性规则用于保证关系的主键与外键的取值必须是正确的和有效的。用户定义完整性是用户应用环境中需要遵循的特定约束条件,体现用户应用环境中特殊的业务规则。 1.实体完整性 主键的值必须是唯一的和确定的,...
级联删除:ON DELETE CASCADE 数据库的设计 数据库的设计 1. 多表之间的关系 1. 分类: 1. ⼀对⼀(了解): 2. ⼀对多(多对⼀): 3. 多对多: 2. 实现关系: 1. ⼀对多(多对⼀): * 实现⽅式:在多的⼀⽅建⽴外键,...
我下载了Microsoft SQL,并在应用程序中运行了基本查询和中间查询 基本查询功能包括创建表,插入,选择和... 使用主键和外键,在删除集上设置为null以及在删除级联上创建的表 Insert语句包含2种方法:使用默认主键和
我这里说的谨慎,是因为级联删除和级联更新有些突破了传统的关于外键的定义,功能有点 太过强大,使用前必须确定自己已经把握好 其功能范围,否则,级联删除和级联更新可能让你的数据莫名其妙 的被修改或者丢失。...
很奇怪),分别是CascadeType.PERSIST(级联新建),CascadeType.REMOVE(级联删除),CascadeType.REFRESH(级联刷新),CascadeType.MERGE(级联更新),CascadeType.ALL(全部四项) * 方法一 * 主表: ?@OneToOne...
(8)创建一个级联删除触发器student_delete。要求:当从学生表中删除某学生信息时,同时删除score表中此学生相关的选课记录。 (9)创建一个触发器student_insert,实现功能:如果往学生表中插入数据,则自动修改...
3.数据库没设计好,外键直接引用的主键属性,所以没做级联更新 4.其实这个项目是个团队作业,组员水平不一,所以写的简单,适合初学者学习,高手勿喷 5.sql文件我用的Navicat导出的,导入好像有点问题,自己改一改吧...
6. 外键关联:在添加字段的时候,可以设置该字段是否外键,外键字段需要关联某个实体的主键,从而可以实现`一对一`或`一对多`关联。 7. 级联扩展:外键字段或多对多实体上可以配置级联字段,级联字段可以作为被关联...
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 ...
说到这儿也许你会想到外键约束怎么办,我的博客表,论坛帖子表都有用了User表的主键做外键呀。这个很容易处理,我们需要当机立断的删掉外键,这个当机立断可能会带来一些麻烦,我们来分析下可能会遇到一些什么问题:...
文章目录一、标识列二、外键约束1、外键约束创建要求2、级联操作三、复制表 一、标识列 介绍 标识列,又称为自增列,可以不手动插入数值,系统提供默认的序列值。 特点 标识列必须和一个key搭配(key:主键、唯一键...
delete:在删除当前对象的时候,级联删除和他相关联的对象 all: save-update+delete delete-orphan:解除关联关系时,删除和当前对象失去关联的对象 all-delete-orphan:all+delete-orphan 单向的一对多的关系,在进行...
其中数据库用到级联删除。配置文件分别用list、set和map元素配置第二张表。 07 07Hibernate_Mapping : Hibernate中的数据关联技术,是一个重点又是一个难点,演示了 一对一、多对一、一对多、多对多等几种情况。
熟练掌握主键约束 熟练掌握外键约束 熟练掌握UNIQUE约束 熟练掌握空值约束 理解CHECK约束的作用 掌握增、删、改被参照关系主键值时,对参照关系产生影响的几种策略,如受限 删除、级联删除、置空等策略。...