简单说下外键

外键的使用大家都不陌生,是我们用于保持数据引用完整性的作用~辣今天我就分享一下外键的一些限制。

1、外键引用的是需要其它表的主键,或者候选键。(这个比较好理解,就不写代码了╮(╯_╰)╭)

2、外键创建之后并不会自动创建索引,这个是有开发人员自己考虑在外键上建相关索引是否能获取到查询效率上的提升

3、默认的情况下如果在引用表插入不存在的外键值或者在主表删除了一个被引用的数据,数据库都会报错。比如我们做个栗子

CREATE TABLE PK_Table
(
    ID INT IDENTITY(1,1) PRIMARY KEY,
    Name NVARCHAR(50)
)

INSERT INTO dbo.PK_Table
        (  Name )
VALUES  ( ‘主键1‘),(‘主键2‘);

CREATE TABLE FK_Table1
(
    ID INT PRIMARY KEY,
    PKID1 INT CONSTRAINT FK_1 FOREIGN KEY REFERENCES PK_Table(ID) ON DELETE NO ACTION,
    Name NVARCHAR(50) UNIQUE
)

INSERT INTO dbo.FK_Table1
        (  ID,PKID1, Name )
VALUES  (  1,1,N‘外键1‘ ),(  2,2,N‘外键2‘ );

CREATE TABLE FK_Table1_1
(
    ID INT IDENTITY(1,1) PRIMARY KEY,
    FKID1 INT CONSTRAINT FK_1_1 FOREIGN KEY REFERENCES FK_Table1(ID) ON DELETE NO ACTION,
    Name NVARCHAR(50)
)

INSERT INTO dbo.FK_Table1_1
        (  FKID1, Name )
VALUES  (  1,N‘外键1_1‘ ),(  1,N‘外键1_2‘ ),(  2,N‘外键2_1‘ ),(  2,N‘外键2_2‘ );

然后删除一条

DELETE FROM dbo.PK_Table WHERE ID = 2
或者
DELETE FROM dbo.FK_Table1 WHERE ID = 2

数据库直接抛错~正常嘛,人家就是这样纸定义的。

但是其实行为并不止 NO ACTION 一种,还有CASCADE (级联删除), SET NULL(设置空) 和 SET DEFAULT(设置默认值) 3种行为的 字面上比较好理解。

SET NULL 和 SET DEFAULT 就比较好理解就不说了~

级联的话如果定义了就一定要小心。 还是定义刚刚的Table 只是将FK_Table1 改成 CASCADE

CREATE TABLE PK_Table
(
    ID INT IDENTITY(1,1) PRIMARY KEY,
    Name NVARCHAR(50)
)

INSERT INTO dbo.PK_Table
        (  Name )
VALUES  ( ‘主键1‘),(‘主键2‘);

CREATE TABLE FK_Table1
(
    ID INT PRIMARY KEY,
    PKID1 INT CONSTRAINT FK_1 FOREIGN KEY REFERENCES PK_Table(ID) ON DELETE CASCADE,
    Name NVARCHAR(50) UNIQUE
)

INSERT INTO dbo.FK_Table1
        (  ID,PKID1, Name )
VALUES  (  1,1,N‘外键1‘ ),(  2,2,N‘外键2‘ );

CREATE TABLE FK_Table1_1
(
    ID INT IDENTITY(1,1) PRIMARY KEY,
    FKID1 INT CONSTRAINT FK_1_1 FOREIGN KEY REFERENCES FK_Table1(ID) ON DELETE NO ACTION,
    Name NVARCHAR(50)
)

然后一删除~

DELETE FROM dbo.PK_Table WHERE ID = 2

DELETE 语句与 REFERENCE 约束"FK_1"冲突。该冲突发生于数据库"Test",表"dbo.FK_Table1", column ‘PKID1‘。

其实就是因为 FK_Table1 的行不能删除引起的~所以,如果定义了CASADE 要注意多层嵌套的使用

时间: 2024-10-23 19:18:32

简单说下外键的相关文章

《Entity Framework 6 Recipes》中文翻译系列 (37) ------ 第六章 继承与建模高级应用之独立关联与外键关联

翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 6-13  在基类中应用条件 问题 你想从一个已存在的模型中的实体派生一个新的实体,允许基类被实例化. 解决方案 假设你有如图6-20所示的模型. 图6-20 包含Invoice实体的模型 这个模型只包含一个单独的实体Invoice(发货单).我们想从Invoice派生一个新的实体,它表示删除掉的发货单.这将允许我们以更清晰的业务逻辑来分别对有效的发货单和已删除掉的发货进行不同的操作.按下面

MySQL——外键

概念 关键字:foreign key,也叫做外键约束! 如果一个实体A的某个字段,刚好指向另一个实体B的主键,那么实体A的这个字段就叫做外键: 所以,简单来说,外键就是本表的某个字段指向外表的主键! 上面的,学生表中的班级字段其实就是一个外键! 其中,被指向的实体集(班级表),叫做主实体集(主表),也叫做父实体集(父表),负责指向的实体集(学生表),叫做从实体集(从表),也叫做子实体集(子表) 作用 外键的意义就是用来约束关系内的实体! 为什么需要有外键约束,因为需要在插入记录的时候,保证其符合

MySQL外键约束的使用

软件工程试验二中要求建立如下数据库: 使用MySQL建立一个“图书数据库“ BookDB,包含两张表:– Book {ISBN (PK), Title, AuthorID (FK), Publisher, PublishDate, Price}– Author {AuthorID (PK), Name, Age, Country} 其中FK是 foreign key的意思,即给Book数据表加上一个外键约束,下面先解释下外键约束的作用. 定义外键主要是为了维护关系数据库的完整性,使相关数据表之间

数据库到底用不用外键

最近工作中用到powerdesigner ,前期需要通过powerdesigner生成表结构,后来由于负责人员不在,很多表结构的添加没有同步到powerdesigner,一个个核对表结构着实麻烦,于是想到到反向生成模型,但数据库没有外键关系导致生成的模型也没有外键.对项目中不用外键感到好奇于是问了相关人员原因,并简单了解了外键的特点和使用场景.为了进一步了解,在网上找了相关文章以下为转载的原文链接: http://www.cnblogs.com/pengxl/archive/2010/06/11

Mysql的外键

概念:如果一个实体A的某一字段,刚好指向或引用另一个实体B的主键,那么实体A的这个字段就叫作外键,所以简单来说,外键就是外面的主键,就是其他表的主键. 例: 以上的学生表的班级字段,就是一个外键! 其中,被指向的实体集,称之为父表(主表),负责指向的那个表就是子表(从表),上面的学生表就是子表,班级表就是父表! 作用: 外键的意义就是用来约束关系内的实体! 假如上面学生表中有一个学生的班级字段是11,就不符合正常的业务逻辑!因为班级表中没有id为11的记录. 所以,外键约束主要体现在以下的两个方

055:ORM外键使用详解

外键:在 MySQL 中,表有两种引擎,一种是 InnoDB ,另外一种是 myisam .如果使用的是 InnoDB 引擎,是支持外键约束的.外键的存在使得 ORM 框架在处理表关系的时候异常的强大.因此这里我们首先来介绍下外键在 Django 中的使用. 类定义为 class ForeignKey(to,on_delete,**options) .第一个参数是引用的是哪个模型,第二个参数是在使用外键引用的模型数据被删除了,这个字段该如何处理,比如有 CASCADE . SET_NULL 等.

Django中ORM外键和表的关系(Django编程-4)

外键 在MySQL中,表有两种引擎,一种是InnoDB,另外一种是myisam.如果使用的是InnoDB引擎,是支持外键约束的.外键的存在使得ORM框架在处理表关系的时候异常的强大.因此这里我们首先来介绍下外键在Django中的使用. 类定义为class ForeignKey(to,on_delete,**options).第一个参数是引用的是哪个模型,第二个参数是在使用外键引用的模型数据被删除了,这个字段该如何处理,比如有CASCADE.SET_NULL等.这里以一个实际案例来说明.比如有一个

sqlalchemy外键和relationship查询

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

牛腩新闻发布系统---外键约束下如何删除记录

一.为什么使用外键? 查了些资料,八个字"保持完整性.一致性",结合我之前做的重构机房收费系统,我的理解是"防止相关表中数据没有关联而变得孤立,最终导致数据冗余",得出这个结论是上次让贾丽敏帮忙点系统时候我最深刻的感受,因为我的数据库关系图中辣么多张表却没有丝毫关系-- 既然官方解释是"完整性和一致性",就先来说明一下: 对于完整性和一致性,不少人都混为一谈了. 完整性(integrity)更多是针对实际业务来说的,比如说一个职员ID,不能在一个