精华内容
下载资源
问答
  • 我们在使用 MySQL 数据库时,添加数据如果设计不合理很容易出现外码约束的情况,为什么会产生这样的问题?那我们该如何处理这一问题呢?依据又是什么?本篇文章带你进一步来深度剖析,并带着你的思路来设计解决方案...


    前言

    我们在使用 MySQL 数据库时,添加数据如果设计不合理很容易出现外码约束的情况,为什么会产生这样的问题?那我们该如何处理这一问题呢?依据又是什么?本篇文章带你进一步来深度剖析,并带着你的思路来设计解决方案。

    在这里插入图片描述


    本次案例的案例情景是传统的数据库表:学生-课程数据库。

    一、插入新数据时报错外键约束?

    我们在 Course 表中插入课程号为 1 的数据时提示违反了外键约束。插入语句如下:

    insert into course(cno,cname,cpno,ccredit) values('1','数据库','5',4);
    

    二、对于出错 SQL 语句的分析

    我们先根据 Course 表的定义,看哪一个是外键。查看 Course 表定义的 SQL 语句如下:

    create table course (
    cno char(4) primary key,
    cname char(40),
    cpno char(4),
    ccredit smallint,
    foreign key cpno references course(cno));
    

    从上面的 SQL 语句可以看出,cpno 是外键,而且引用的是本表的主键 cno。

    三、对于外码约束的分析

    我们根据数据库定义的参照完整性规则得知:外键 cpno 的取值不为空的情况下(如上 cpno=‘5’),与其对应的主键 cno 在参照表中必须存在。

    但是我们反观上面操作,第一个插入的就是 cno=‘1’ 的数据,cno=‘5’ 的还没有插入,很显然不满足参照完整性规则。

    四、如何处理外键约束?

    解决方法:

    1. 插入数据的时候,所有的 cpno 字段暂时都置为 null,所有数据插入以后,再依次更新这些数据的 cpno 的值。该方法的优点是复杂性低,容易实现。
    2. 插入数据的时候,不是按表中 cno 的顺序插入,而是根据数据依赖的关系插入数据。比如,根据表里的数据,分析得出可以按 cno=2、6、4、7、5、1、3 的顺序插入数据。

    总结

    本文我们掌握了 MySQL 数据库如何在设计不合理时遇到的外码约束的问题,并通过经典案例为大家分析了为何会出现这样的问题,同时顺着思路来设计业务的解决方案。本文提到的数据库参照完整性规则是数据库设计的基础知识,大家切记要重视基础,活学活用,方能在开发中百战不殆!

    在这里插入图片描述


    感谢大家的支持,我是白鹿,一个不懈奋斗的程序猿。希望本贴能帮助到大家,欢迎大家的一键三连!如果还有什么问题、建议或者补充可以留言在帖子下方,给予更多人帮助!
    更多资讯微信搜索公众号【WDeerCode代码圈

    展开全文
  • 主键与外键

    2014-06-14 21:03:45
    数据库中主键与外键的理解 在关系型数据库中,数据结构有逻辑结构和物理结构。物理结构指存储在物理介质上的数据文件的结构。逻辑结构即关系,也就是一张张的二维表。表中的一列即为一个字段(属性),代表的是...

    数据中主与外的理解

    系型数据中,数据构有逻辑结构和物理构。物理构指存在物理介上的数据文件的构。逻辑结构即系,也就是一张张的二表。表中的一列即一个字段(属性),代表的是体的一个属性。表中的一行即一条记录。如:学生表中(学号,姓名,年,性),在表中有4个字段,代表学生体的4个属性。表中的一行数据(001三,男,20),即一条记录,表示的是个学生的信息。 

    在表中,用来唯一标识一条记录的字段集,叫做主关键字或者主关键码称主(主),而包含的属性(字段)叫做主属性,其他的则为非主属性。既然是字段集,那就可能是一个字段或者多个字段。例如上面的学生表,用下划线表示的学号,就是能唯一标识一个学生的字段,学号字段就是表的主。由于学生的姓名重名是不可避免的,所以一般不用姓名来作唯一标识一个学生的主

        个例子明一下多个字段作。例如学生选课表(学号,程号,成),在学生选课表中,主关键字是(学号,程号)。原因而易,一个学生可以选择门课程,一个程可以被多个学生选择。如果单单是用学号或者程号,都不足以唯一标识一条记录 

    于外的理解,在里我也个例子。假有两个表,学生表(学号,姓名,年,性专业编号),专业信息表(专业编号,专业名称,专业备注信息)。学生表中主是学号,专业信息表中主专业编号。学生表中的非主属性专业编号恰好是专业信息表中的主。我就称专业编号是学生表的外这样一个表的非主属性是另一个表的主属性,非主属性就是外

      

    数据束有三体完整性束、参照完整性束和用自定义约束。

    1.体完整性束指的是主不能空,如果主键为空了唯一标识一条记录

    2.参照完整性束,即外束,某一外在它引用的主字段中存在。如,学生表中专业编号属性的,必都存于专业信息表中的专业编号属性中。想一想也就明白了,一个学生(大学生)怎可能属于一个不存在的专业

    3.自定完整性束,指的是一些用自己定的束,例如字段是否可以空,字段的取(如:人的性只能取男、女)。

     

    主键的作用    

    1)保证实体的完整性;   

    2)加快数据的操作速度   

    3)在表中添加新记录时db会自动检查记录的主键值,不允许该值与其他记录的主键值

      

    合主就是用2个或2个以上的字段成主个主包含的字段作合在数据表中是唯一,且加了主索引。

    可以这么理解,比如,你的订单表里有很多字段,一般情况只要有个订单bill_no做主就可以了,但是,在要求可能会有订单,使用相同的订单号,那么这时单独使用订单号就不可以了,因会有重。那你可以再使用个订单序列号bill_seq来作。把bill_nobill_seq合主。即使bill_no相同,bill_seq不同也是可以的

    展开全文
  • 数据库的主键与外键

    2018-06-08 17:31:59
    一、定义 主键:在数据表中... 外键:表的外键是另一表的主键用于保持数据的一致性, 外键可以有重复的, 可以是空值。 如:A表中的一个字段,是B表的主键,那他就可以是A表的外键。二、 主键、外键和索引的区别...

    一、定义
        主键:在数据表中可以作为唯一标识的字段,不能有重复的,不允许为空。
               如:学生表(学号,姓名,性别,班级) 其中每个学生的学号是唯一的,学号
        就是一个主键 ;
        外键:表的外键是另一表的主键用于保持数据的一致性, 外键可以有重复的, 可以是空值。

              如:A表中的一个字段,是B表的主键,那他就可以是A表的外键。

    二、  主键、外键和索引的区别 

            主键、外键和索引的区别?

     

    主键

    外键

    索引

    定义:

    唯一标识一条记录,不能有重复的,不允许为空

    表的外键是另一表的主键, 外键可以有重复的, 可以是空值

    该字段没有重复值,但可以有一个空值

    作用:

    用来保证数据完整性

    用来和其他表建立联系用的

    是提高查询排序的速度

    个数:

    主键只能有一个

    一个表可以有多个外键

    一个表可以有多个惟一索引

    数据库的约束有三种,实体完整性约束、参照完整性约束和用户自定义约束。

        1.实体完整性约束指的是主键不能为空,如果主键为空了还怎么唯一标识一条记录。

        2.参照完整性约束,即外键的约束,某一外键的值必须在它引用的主键字段中存在。如,学生表中专业编号属性的值,必须都存于专业信息表中的专业编号属性中。想一想也就明白了,一个学生(大学生)怎么可能属于一个不存在的专业。

        3.用户自定义完整性约束,指的是一些用户自己设定的约束,例如字段是否可以为空,字段值的取值范围(如:人的性别只能取男、女)。

    实例:

    一表的主键, 外键可以有重复

    实例:

    createtable Student

    (

    StudentNointPRIMARY KEY IDENTITY(1,1),--加主键约束,还有标识列属性(两者构成实体完整性)

    StudentNamenvarchar(15)notnull, --加非空约束,不加"not null" 默认为:可以为空

    StudentSchooltext(20)FOREIGNKEY REFERENCES SchoolTable(SchoolName),--加外键约束,格式:FOREIGN KEY REFERENCES 关联的表名(字段名)

    StudentAgeintDEFAULT ((0)),--加默认值约束

    StudentSexnvarchar(2)CHECK(StudentSex=N''or StudentSex=N'')--加检查约束,格式:check (条件表达式)

    )

    --如果在表创建好了以后再加约束,则格式分别为:

    --主键:

    altertable表名

    addconstraint PK_字段名--"PK"为主键的缩写,字段名为要在其上创建主键的字段名,'PK_字段名'就为约束名

    primarykey(字段名)--字段名同上

    --唯一约束:

    altertable表名

    addconstraint UQ_字段名

    unique(字段名)

    --外键约束:

    altertable表名

    addconstraint FK_字段名--"FK"为外键的缩写

    foreignkey(字段名)references关联的表名(关联的字段名)--注意'关联的表名''关联的字段名'

    altertableAaddconstraint FK_Bforeignkey (ticket_no)referencesB(ticket_no)

    altertableAaddconstraint FK_Cforeignkey (person_no)referencesC(person_no)

    altertable成绩表addconstraint FK_StudentNoforeignkey (StudentNo)references Student(StudentNo)

    ONUPDATECASCADE ON DELETE CASCADE

    级联更新,级联删除,这样在删除主表Student时,成绩表中该学生的所有成绩都会删除。

    --检查约束:

    altertable表名

    addconstraint CK_字段名

    check(条件表达式)--条件表达式中的条件用关系运算符连接

    --默认值约束:

    altertable表名

    addconstraint DF_字段名

    default'默认值'for字段名--其中的'默认值'为你想要默认的值,注意'for'

    --删除创建的约束:

    altertable表名

    dropconstraint约束名--约束名为你前面创建的如:PK_字段这样的约束名

    --注意:如果约束是在创建表的时候创建的,则不能用命令删除

    --只能在'企业管理器'里面删除

    --获取SqlServer中表结构

    SELECT syscolumns.name,systypes.name,syscolumns.isnullable,

    syscolumns.length

    FROM syscolumns,systypes

    WHERE syscolumns.xusertype= systypes.xusertype

    AND syscolumns.id=OBJECT_ID('Student')

    --单独查询表递增字段

    SELECT [name]FROM syscolumnsWHERE

    id = OBJECT_ID(N'Student')ANDCOLUMNPROPERTY(id,name,'IsIdentity')=1

    --获取表主外键约束

    EXECsp_helpconstraint'StuResults'

    --查询表主键外键信息

    SELECT sysobjects.id objectId,OBJECT_NAME(sysobjects.parent_obj) tableName,

    sysobjects.name constraintName, sysobjects.xtypeAS constraintType,

    syscolumns.nameAS columnName

    FROM sysobjectsINNERJOIN sysconstraints

    ON sysobjects.xtypein('C','F','PK', 'UQ','D')

    AND sysobjects.id= sysconstraints.constid

    LEFTOUTERJOIN syscolumnsON sysconstraints.id= syscolumns.id

    WHEREOBJECT_NAME(sysobjects.parent_obj)='StuResults'


    展开全文
  • PowerDesigner创建索引与外键

    千次阅读 2018-08-12 11:32:23
    一、创建索引 双击Table-》Columns-》创建索引 Step1:双击Table Step2:选择Columns-》创建索引 弹出如下窗口: ...二、创建外键 ...如有二张表A和表B,A表b_id是外键,指向B表主键b_id  ...

    一、创建索引

    双击Table-》Columns-》创建索引

    Step1:双击Table

    Step2:选择Columns-》创建索引

    弹出如下窗口:

    Step3:选择columns标签

    Step4:选择Add Columns..

    Step5:勾选要作为索引的列即可。

    二、创建外键

    如有二张表A和表B,A表b_id是外键,指向B表主键b_id

                    

    创建外键方式:

    1、A表b_id(外键)与B表b_id(主键)名称相同,可直接指向。应用Refrence

     A指向B

    效果如下所示:

    注:若A表外键名与B表主键名不一致。A表外键bid指向B表主键b_id

         

    则Refrence,A指向B,双击连接线。弹出框如下所示:可指定索引名字,此处应用默认索引名称。

    选择Joins标签页,如下所示:

    应用-》确认 后效果如下所示:

    双击A表,选择“Preview”标签,显示效果如下所示:

    将上述代码拷贝到Mysql数据库,即可执行啦!

    展开全文
  • (二)表的连接与外键约束

    千次阅读 2015-08-10 20:35:29
    外键约束和表连接 【建立表的关系】 1.额外建立一张表描述两个表之间的关系,存储两张需要连接的表的主键对应关系。 2.利用外键约束 外键:一张表的某个字段引用着另一张表的主键,在数据多的表中多一个字段...
  • Oracle 索引监控与外键索引

    千次阅读 2013-03-29 10:49:56
    Oracle 监控索引特性为我们提供了一个大致...其次对于存在子表存在外键的情形,对于主表进行操作时是否会导致索引被监控呢?下面描述的是这个话题。 1、普通监控索引的情形--演示环境 SQL> select * from v$version
  • 数据库中主键与外键的理解
  • 数据库中主键与外键

    2019-02-17 15:18:00
    主键除了上述作用,常常与外键构成参照完整性约束,防止出现数据不一致。所以数据库在设计时,主键起到了很重要的作用。 常见的数据库主键选取方式有: · 自动增长字段 · 手动增长字段 · ...
  • 主键索引,主键与外键的关系

    千次阅读 2013-01-03 17:54:35
    简单来讲 : 主键用来标识记录,索引用来加速查询。  主键一定是唯一性索引,唯一性索引并不一定就是主键 ...主键除了上述作用,常常与外键构成参照完整性约束,防止出现数据不一致。数据库在设计时,主键起到了
  • 一、什么是主键、外键: 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键比如 : 学生表(学号,姓名,性别,班级) 其中每个学生的学号是...
  • SQL数据库中的主键与外键介绍 一、什么是主键、外键: 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键比如 : ...
  • 在数据库什么是主键与外键2008-03-05 15:03这需要... 2)主键:当有多个候选时,可以选定一个作为主,选定的候选称主键 3)外键: 关系R中的一个属性组,它不是R的候选,但它另一个关系S的候选相对应,则称
  • 查看外键名称查看数据库外键名字

    千次阅读 2019-10-29 12:46:35
    我们要进行删除外键时,需要知道外键的名字,那么如何查看数据库外键呢?有2种方式查看: 1.过查看表的方式查看外键名字; 2.通过mysql自带的系统表查看外键。 更多精彩请访问本文源地址: ...
  • 加入外键产生错误

    2014-06-19 16:29:01
    今天想试一下插入外键约束,然后就出了一堆cu
  • 查询外键

    2019-05-08 12:06:19
    ----查询外键 SELECT A.owner 外键拥有者, A.table_name 外键表, A.constraint_type 外键类型, C.column_name 外键列, b.owner 主键拥有者, b.table_name 主键表, b.constraint_type 主键类型, d....
  • 外键外键约束理解

    万次阅读 多人点赞 2018-08-20 20:11:27
    数据库(外键及其约束理解) 一:首先是外键的定义  如果一个字段X在一张表(表一)中是主关键字,而在另外一张表(表二)中不是主关键字,则字段X称为表二的外键;换句话说如果关系模式R1中的某属性集不是自己的...
  • 如何分清SQL数据库中的主键与外键

    千次阅读 热门讨论 2013-06-16 11:09:49
    如何分清SQL数据库中的主键与外键    一、什么是主键、外键: 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键比如 : 学生表(学号,...
  • SQL中主键与外键的定义和区别

    千次阅读 2016-08-07 16:44:31
    主键是本张表的主键,是唯一且非空的,而外键是另一张表中这张表的某个字段的类型,字段名相同的字段,一般是用作关联两张或两张以上的数据表时用的。 以下面三张表为例:  有三张表,一张表是读者信息,有...
  • 外键 外键: foreign key,外面的链(键不在自己表中):如果一张表中有一个字段(非主键)指向另外一张表的主键, 那么将该字段称之为外键. 增加外键 外键可以在创建表的时候或者创建表之后增加(但是要考虑数据的问题)。 ...
  • 外键约束

    千次阅读 2018-09-27 18:09:19
    如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键
  • 外键关联

    2019-10-03 20:28:22
    一、如果一张表中有一个非主键的字段指向了别一张表中的主键,就将该字段叫做外键。 一张表中可以有多个外键外键的默认作用有两点: 1.对子表(外键所在的表)的作用:子表在进行写操作的时候,如果外键...
  • 数据库的事务:事务即用户定义的一个数据库操作序列,这些操作要么全做要全不做,是一个不可分割的工作单位,它具有四个特性...2.外键用于另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。 ...
  • 添加外键

    2020-08-18 15:55:24
    alter table `表名` add constraint 自定义外键名 foreign key (外键字段) references `关联表名`(`关联字段`); 示例: # 添加外键: `Score` 表中的 `SubjectId`字段 关联 `Subject` 表的 `SubjectId` 字段 alter ...
  • 定义外键

    千次阅读 2018-10-21 01:26:00
    外键是非常重要的概念,也是体现关系数据库中“关系”二字的体现,通过使用外键,我们才能把互相独立的表关联起来,从而表达丰富的业务语义。 外键是定义在源表中的,定义位置同样为所有字段定义的后面,使用...
  • MySql数据库主键外键与数据库设计

    千次阅读 2019-05-20 01:38:57
    MySql数据库主键外键与数据库设计
  • sql外键_SQL外键

    千次阅读 2020-07-27 05:46:11
    sql外键 In this article let us review different ways to create a SQL foreign key, rules on updates and deletes, enabling foreign key constraints, disabling foreign key constraints and not for ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 22,494
精华内容 8,997
关键字:

外码与外键