学习测试:外键

--=======测试:外键=========-----
--=======Auther:Su=========-----
--=======Time:2015-06-26===-----

--=========================-----
--*******理论知识**********-----
--=========================-----
--新增表时加外键:foreign key(列名) references 引用外键表(列名)ON DELETE NO ACTION /ON UPDATE NO ACTION /*还可接CASCADE,SET NULL,SET DEFAULT*/
--已存在表加外键:alter table 表名 add constraint 外键约束名 foreign key(列名) references 引用外键表(列名[可以省略])ON DELETE NO ACTION ON UPDATE NO ACTION /*还可接CASCADE,SET NULL,SET DEFAULT*/
--NO ACTION:表示不执行任何操作,当删除主键表中数据时,如果外键表中有相应的数据,则主键表中的删除操作 失败,该选项为默认选项。
--CASCADE : 表示级联操作,当删除主键表中数据时,外键表中相应的数据会被自动删除
--SET NULL: 执行级联操作,并且将外键表中的所有数据都设置为空值。
--SET DEFAULT :与SET NULL类似,外键表中数据都设置为默认值。
--主键表和外键表:T1.ID是表T2的外键,而且是表T1的主键,那么对于T1.ID来说表T1就是主键表,表T2就是外键表
--删除外键alter table 表名 drop constraint 外键名
--不检查约束alter table 表名 nocheck constraint 外键名
--检查约束alter table 表名 check constraint 外键名

--=========================-----
--*******测试代码**********-----
--=========================-----

--测试一:新增和删除记录
    --新建表及外键
    CREATE TABLE T1(ID BIGINT not null default(0),Name nvarchar(100),PRIMARY KEY(ID))
    CREATE TABLE T2(ID BIGINT not null default(0),Class int,PRIMARY KEY(ID),foreign key(ID) references T1(ID))
    --=========================-----
    --==插入主键表数据
    INSERT INTO T1
    SELECT 1,‘CS1‘UNION ALL
    SELECT 2,‘CS2‘
    --==插入外键表数据
    INSERT INTO T2
    SELECT 1,111 UNION
    SELECT 3,333
    --消息 2627:INSERT 语句与 FOREIGN KEY 约束"FK__T2__ID__32D74F96"冲突。该冲突发生于数据库"vobao_lab",表"dbo.T1", column ‘ID‘。
    --原因:插入外键表时,发现T1没有ID=3的列,可以把脚本改成以下:
    INSERT INTO T2
    SELECT 1,111 UNION
    SELECT 2,222
    --执行成功
    --==删除数据
    DELETE FROM T1 WHERE ID=1
    --消息 547:DELETE 语句与 REFERENCE 约束"FK__T2__ID__32D74F96"冲突。该冲突发生于数据库"vobao_lab",表"dbo.T2", column ‘ID‘。
    --原因:T2有对应的记录,T1该记录就不能删除,将T2对应记录删除后T1记录就可以操作了
    DELETE FROM T2 WHERE ID=1
    DELETE FROM T1 WHERE ID=1
--结论一:外键表有的记录主键表一定有,主键表有的记录外键表不一定有,外键表有的记录主键表对应记录不能删除(主键表不能删除:消息 3726)

--测试二:CASCADE
    --创建表
    CREATE TABLE T1(ID BIGINT not null default(0),Name nvarchar(100),PRIMARY KEY(ID))
    CREATE TABLE T2(ID BIGINT not null default(0),Class int,PRIMARY KEY(ID))
    ALTER TABLE T2 ADD CONSTRAINT T2_ID FOREIGN KEY(ID)references T1 ON DELETE CASCADE
    --==插入主键表数据
    INSERT INTO T1
    SELECT 1,‘CS1‘UNION ALL
    SELECT 2,‘CS2‘
    --==插入外键表数据
    INSERT INTO T2
    SELECT 1,111 UNION
    SELECT 2,222
    --==删除数据
    DELETE FROM T1 WHERE ID=1
    --执行成功,同时删除T1和T2中ID=1的记录
    DELETE FROM T2 WHERE ID=2
    --执行成功,删除T2中ID=2的记录
--结论二:CASCADE:当删除主键表中记录时,外键表中相应的记录会被自动删除;删除外键表记录时,主键表记录不会删除

--测试三:SET NULL/DEFAULT
    --创建表
    CREATE TABLE T1(ID BIGINT not null default(0),Name nvarchar(100),PRIMARY KEY(ID))
    CREATE TABLE T2(ID BIGINT not null default(0),Class int,PRIMARY KEY(ID))
    ALTER TABLE T2 ADD CONSTRAINT T2_ID FOREIGN KEY(ID)references T1 ON DELETE SET DEFAULT
    --==插入主键表数据
    INSERT INTO T1
    SELECT 1,‘CS1‘UNION ALL
    SELECT 2,‘CS2‘UNION ALL
    SELECT 3,‘CS3‘
    --==插入外键表数据
    INSERT INTO T2
    SELECT 1,111 UNION
    SELECT 2,222
    --==删除数据
    DELETE FROM T1 WHERE ID=1
    --消息 547:DELETE 语句与 FOREIGN KEY 约束"T2_ID"冲突。该冲突发生于数据库"vobao_lab",表"dbo.T1", column ‘ID‘。
    --原因:删除T1中ID=1的记录,在将T2中ID=1的记录更新为ID=0时发出错误,因为T1不存在ID=0的记录

--==插入主键表数据
    INSERT INTO T1
    SELECT 0,‘CS0‘
    --==删除数据
    DELETE FROM T1 WHERE ID=1
    --执行成功,删除T1中ID=1的记录和将T2中ID=1的记录更新为ID=0
    DELETE FROM T2 WHERE ID=2
    --执行成功,删除T2中ID=2的记录
--结论三:SET NULL/DEFAULT:当删除主键表中记录时,外键表中相应的记录会被自动更新为NULL或者DEFAULT(如果主键表的主键值不允许空或者不存在DEFAULT值,则执行失败);删除外键表记录时,主键表记录不会删除

--不检查约束alter table 表名 nocheck constraint 外键名
alter table T2 nocheck constraint T2_ID
DELETE FROM T1 WHERE ID=0
--检查约束alter table 表名 check constraint 外键名
alter table T2 check constraint T2_ID
INSERT INTO T1 SELECT 0,‘CS0‘
DELETE FROM T1 WHERE ID=0
--删除外键alter table 表名 drop constraint 外键名
ALTER TABLE T2 DROP CONSTRAINT T2_ID

时间: 2024-10-08 08:35:27

学习测试:外键的相关文章

SQL Server数据库学习笔记-外键

关于主键的话大家很好理解,主键的主要作用就是用来标识一条数据是唯一的,也就是保证数据的实体完整性.防止数据重复.但是外键的话就有许多的疑问了,那外键是咋回事儿呢? 1. 外键的定义: 外键(FK)是用于建立和加强两个表数据之间连接的一列或多列.通过将保存表中主键值的一列或多列中的值添加到另一个表中,可创建两个表之间的连接.这个列就成为第二个表的外键.它表示了两个表之间的关系. 2. 为什么要使用外键? 为了保证数据的参照完整性.补充:参照的完整性要求关系中不允许引用不存在的实体.与实体完整性是关

MySQL学习(四)——外键

1.比方现在有两张表"分类表"和"商品表",为了表明商品属于哪个分类,通常我们将在商品表上添加一列,用于存放分类cid的信息,此列称为:外键. 此时分类表category称为主表,cid称为主键:商品表products称为从表,category_id称为外键. 外键特点:1)从表外键的值是对主表主键的引用 2)从表外键类型必须与主表主键一致. 使用外键的目的:保证数据的完整性 2.首先在命令提示符内创建一个数据库web09,并创建两张表category和produc

补12.关于mysql的外键约束

一.什么是mysql中的外键(froeign key) 假如说有两张表,其中一张表的某个字段指向了另一张表的主键,这就可以称之为外键(froeign key). 在子表中增加一条记录时,需要确定是否有与父表相对应的记录. 如果父表没有对应的记录,那么子表(从表)无法插入这条数据. 下面是一个关于外键的示例: 1.首先创建一个主表,这个主表存放了班级信息. create table class ( id TINYINT PRIMARY KEY auto_increment, class_name

Entity Framework Code First主外键关系映射约定

本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个不同表之间可以存在外键依赖关系,一个表自身也可以有自反关系(表中的一个字段引用主键,从而也是外键字段). Entity Framework Code First默认多重关系的一些约定规则: 一对多关系:两个类中分别包含一个引用和一个集合属性,也可以是一个类包含另一个类的引用属性,或一个类包含另一个类

sqlalchemy外键和relationship查询

原文地址:https://www.cnblogs.com/goldsunshine/p/9269880.html 阅读目录 一.sqlalchemy体现的外键特性 二.外键和查询 前面的文章中讲解了外键的基础知识和操作,上一篇文章讲解了sqlalchemy的基本操作.前面两篇文章都是作为铺垫,为下面的文章打好基础.记得初一时第一次期中考试时考的不好,老爸安慰我说:“学习是一个循序渐进的过程”,而我的就是按照这样思路来学习数据库外键.首先是了解外键基础理论,然后是sqlalchemy基本操作,最后

[原创]java WEB学习笔记84:Hibernate学习之路-- -映射 一对一关系 ,基外键的方式实现

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

sql学习笔记(21)----------添加外键

最近在忙考试,比较烦!本人一见到考试就蒙圈了!完全大脑空白,不受控制,再加上变态监考老师,更别提有多痛苦了.还好,顺利完成了考试,抽出点空来学习一下MySQL和Oracle,发现点问题,好似很严重. 那么,我想问:  如果让你写SQL语句,添加外键,你会怎么写,如果这就是面试题,你该怎么写呢? 反正我是写不全,不能完全的写正确,平时我们都是是通过数据库的图形工具直接就可以操作主键和外键的设定,但是,如果动真格的去写一些SQL语句,似乎就很吃力了吧!所以我劝自己和读者,耐心点去写一些SQL语句,百

转:使用DBUnit测试时违反外键约束的解决办法

DBUnit是一个基于junit扩展的数据库测试框架.它提供了大量的类对与数据库相关的操作进行了抽象和封装.它会把数据库表里的数据和一个xml文件关联起来,也就是说它可以让数据在XML文件和数据库之间转换.基于这种设计模式DBUnit可以在测试之前,先备份数据库到一个临时XML文件中,然后删除数据库中的所有数据接着把我们写好的模拟数据存入数据库中,最后,在测试完毕后,删除现有数据再存入之前备份的数据,回溯到测试前的状态以达到各个单元测试互不影响的目的. 但是如果dbunit测试的数据表之间存在外

Mysql学习总结(19)——Mysql无法创建外键的原因

在MySQL中创建外键时,经常会遇到问题而失败,这是因为Mysql中还有很多细节需要我们去留意,我自己总结并查阅资料后列出了以下几种常见原因. 1.  两个字段的类型或者大小不严格匹配.例如,如果一个是int(10),那么外键也必须设置成int(10),而不是int(11),也不能是tinyint.另外,你还必须确定两个字段是否一个为 signed,而另一个又是unsigned(即:无符号),这两字段必须严格地一致匹配,更多关于signed和unsigned的信息,请参阅:http://www.