精华内容
下载资源
问答
  • 2021-01-18 18:19:53

    展开全部

    外键(FK)是用于建立和加强两个表数据之间的链接的一列或多列。通过32313133353236313431303231363533e4b893e5b19e31333433633436将保存表中主键值的一列或多列添加到另一个表中,可创建两个表之间的链接。这个列就成为第二个表的外键。

    当创建或更改表时可通过定义 FOREIGN KEY 约束来创建外键。

    例如,数据库 pubs 中的 titles 表与 publishers 表有链接,因为在书名和出版商之间存在逻辑联系。

    titles 表中的 pub_id 列与 publishers 表中的主键列相对应。titles 表中的 pub_id 列是到 publishers 表的外键。

    706a7d48e2387f396636ed48b66f7378.png

    扩展资料:

    保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值或使用空值。

    学号在成绩表(表2)中是主键,在学生表(表1)中是外键。如果不使用外键,表1的学号字段插了一个值(比如20140999999),但是这个值在表2中并没有,这个时候,数据库允许插入,并不会对插入的数据做关系检查。

    然而在设置外键的情况下,插入表1学号字段的值必须要求在表1的学号字段能找到。 同时,如果要删除表2的某个学号字段,必须保证表2中没有引用该字段值的列,否则就没法删除。

    这就是所谓的保持数据的一致性和完整性。如右图,如果表1还引用表2的某个学号,却把表1中的这个学号删了,表2就不知道这个学号对应的学生是哪个学生。

    更多相关内容
  • 我们在使用 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代码圈

    展开全文
  • 我的疑问是 "使用外键约束" ,然后我对 "外键" 这个词不是非常理解。查询相关资料都是讲一些术语。说外键的主要作用是:保持数据的一致性、完整性。听得我是一头雾水。关于外键。我有自己的一些理解,可是不晓得是否...

    我的疑问是 "使用外键约束" ,然后我对 "外键" 这个词不是非常理解。查询相关资料都是讲一些术语。说外键的主要作用是:保持数据的一致性、完整性。听得我是一头雾水。

    关于外键。我有自己的一些理解,可是不晓得是否正确,举个样例来表达我的看法:假如如今须要建立一个表,一个什么样的表呢?一个班级的学生个人信息表:

    6a1635fe08e84cf8e3597113cd7c48c1.png

    所以在设计的时候。就给表1加入一个外键,这个外键就是表2中的学号字段。那么这样表1就是主表,表2就是子表。所以结合2张表就能保持数据的一致性、完整性(预计就是还原成原来的那张大表吧)。

    借着这个样例再谈谈外键的一些事项:

    1、表1能够有一个或者多个外键,也能够没有。(假设表1有多个外键可不能够是这种情况。表2中的多个字段是表1的外键;或者说表1的多个外键是在多个表中)

    2、这个外键能够不是表1的主键,但必须是子表的主键。(简单的说就是。假设一个字段是某个表的外键时。那么该字段必须是主键)

    以上就是我个人对外键的理解。

    -------------------------------------解--------答-------------------------------------

    什么是外键

    +-------+   ref   +-------+

    |  sub  | ------> |  main |

    +-------+         +-------+

    从表(sub)的某列引用(ref)主表(main)的某列的值。

    比方学生表有个学生编号(sid),分数表中的学生列(stu)引用学生表的学 生编号,此时对于分数表的 stu 来说。学生表的 sid 就是外键。

    从表也叫外键表,主表也叫主键表、外表,列也叫字段。

    所以在设计的时候。就给表1加入一个外键,这个外键就是表2中的学号字段。那么这样表1就是主表,表2就是子表。

    你的主从关系理解颠倒了。你的图中,表1的确是主表。表2是子表,但不是叫做给表1加入一个外键,而是给表2加入一个外键,表2中的学号 字段就叫外键,它是表1学号字段的主键。

    你能够这样说:表1的学号字段是表2的外键。

    外键用来干什么

    你贴的图片已经解释了。

    为了一张表记录的数据不要太过冗余。这和软件project的模块化思想差点儿相同类似,仅仅只是在数据库中是对表关系进行解耦,尽量让表 记录的数据单一化。就如你贴的图片中,把成绩和学生信息放在一张表中就太冗余了,成绩全然能够以学生的id作为区分标识。

    为什么说外键能保持数据的一致性、完整性

    你想想,你的图中的第一章表切割成了表1和表2,表2的学号引用了表1的学号字段作为外键,假设不建立外键。仅仅是和表1一样单纯性 地设立一个学号字段。那么和建立外键有什么差别呢?

    比方表1中张三的学号为20140900001,那么我在表2中插数据的时候在学号字段插20140900001来记录张三的成绩不也是做到了表 的解耦了吗?

    这里存在的问题是。在不设置外键的情况下。表2的学号字段和表1的学号字段是没有关联的。仅仅是你自己觉得他们有关系而已。数据库并 不觉得它俩有关系。也就是说,你在表2的学号字段插了一个值(比方20140999999),可是这个值在表1中并没有,这个时候,数据库还是允 许你插入的,它并不会对插入的数据做关系检查。然而在设置外键的情况下。你插入表2学号字段的值必需要求在表1的学号字段能找到。

    同一时候。假设你要删除表1的某个学号字段。必须保证表2中没有引用该字段值的列,否则就没法删除。

    这就是所谓的保持数据的一致性和完整性。你想。如 果表2还引用表1的某个学号,你却把表1中的这个学号删了,表2就不知道这个学号相应的学生是哪个学生。

    数据的一致性还包含数据类型的一致性(这 个见以下就知道了)。

    外键的使用规范

    从表的字段必须与外键类型同样(如上。分数表 stu 的类型必须和学生表 sid 的类型同样,比方都是 int(10) 类型)

    外键必须是主表的唯一键(如上。学生表 sid 是主键,而主键是唯一的。所以能够作为分数表 stu 的外键)

    有关联的字段(如上,分数表之所以使用学生表的 sid 是由于两者有关联,分数表记录的是学生的分数,而学生能够用 sid 来唯 一标识)

    避免使用复合键(也就是说从表能够同一时候引用多个外表的字段作为一个外键,一般不推荐这样的做法)

    你的问题

    假设表1有多个外键可不能够是这种情况,表2中的多个字段是表1的外键;或者说表1的多个外键是在多个表中。

    都能够。由于表1的外键不一定是表2的主键,也能够是唯一键(UNIQUE)。

    比方表2有个主键 A,有个唯一键 B,表1两个字段 A' 和 B’ 分别引用表2的 A 和 B,这就是多对多的关系了。再或者表2主键 A,表3主键 B,表1的两个字段 A' 和 B' 分别引用表2的 A 和表3 的 B。

    这个外键能够不是表1的主键,但必须是子表的主键。(简单的说就是。假设一个字段是某个表的外键时,那么该字段必须是主键)

    由于你前面就理解错了,所以这句话本身就是错的。对于从表来说,外键不一定须要作为从表的主键,外键也不一定是外表的主键,外表的唯一键就能够作 为从表的外键。

    再给一张图以帮助理解

    6329fee6494dfa08226f2e5e8f580dc9.png

    展开全文
  • 满意答案qq5751378872014.06.09采纳率:55%等级:10已帮助:1164人外码必须是另一个关系的主码, 或者 有唯一约束的列。否则创建将要失败!-- 创建测试主表. 无主键.CREATE TABLE test_main2 (id INT NOT NULL,value ...

    满意答案

    dcebd7a0de6265b6ccae5ead692f1eab.png

    qq575137887

    2014.06.09

    dcebd7a0de6265b6ccae5ead692f1eab.png

    采纳率:55%    等级:10

    已帮助:1164人

    外码必须是另一个关系的主码, 或者 有唯一约束的列。

    否则创建将要失败!

    -- 创建测试主表. 无主键.

    CREATE TABLE test_main2 (

    id INT NOT NULL,

    value VARCHAR(10)

    );

    -- 创建测试子表.

    CREATE TABLE test_sub2 (

    id INT NOT NULL,

    main_id INT,

    value VARCHAR(10),

    PRIMARY KEY(id)

    );

    -- 插入测试主表数据.

    INSERT INTO test_main2(id, value) VALUES (1, 'ONE');

    INSERT INTO test_main2(id, value) VALUES (2, 'TWO');

    -- 插入测试子表数据.

    INSERT INTO test_sub2(id, main_id, value) VALUES (1, 1, 'ONEONE');

    INSERT INTO test_sub2(id, main_id, value) VALUES (2, 2, 'TWOTWO');

    SQL> ALTER TABLE test_sub2

    2 ADD CONSTRAINT main_id_cons2

    3 FOREIGN KEY (main_id)

    4 REFERENCES test_main2(id);

    REFERENCES test_main2(id)

    *

    第 4 行出现错误:

    ORA-02270: 此列列表的唯一或主键不匹配

    默认情况下,无法创建外键

    需要创建 unique 约束

    SQL> ALTER TABLE test_main2

    2 ADD CONSTRAINTS t_unique_id2

    3 UNIQUE (id);

    表已更改。

    unique 约束创建完毕后,外键创建成功。

    SQL> ALTER TABLE test_sub2

    2 ADD CONSTRAINT main_id_cons2

    3 FOREIGN KEY (main_id)

    4 REFERENCES test_main2(id);

    表已更改。

    00分享举报

    展开全文
  • SQLServer生成所有外键存储过程,需要一次性将所有varchar改为Nvarchar,有些表具有外键限制不能用代码改。用这个过程,不用再每个表都检查了,不然天量的字段,改到什么时候哦。
  • 1. 创建表的同时添加外键 create table score( ...2. 已经创建表了怎么办:在表的定义进行添加 alter table 表名 add constraint FK_ID foreign key(你的外键字段名) REFERENCES 外表表名(对应的表的主键字
  • 外键

    2021-03-03 20:16:08
    如果公共关键字在一个关系中是主关键字,那么这个...中文名外键外文名foreign key别名外码、外关键字应用学科数据库作用外键定义编辑外键定义设F是基本关系R的一个或一组属性,但不是关系的键,Ks是基本关系S的主...
  • NULL 博文链接:https://yanzhenwei.iteye.com/blog/850724
  • 本文介绍了在MySQL数据库中定义外键的方法。
  • mysql 主键与外键

    2021-02-01 20:03:38
    一、主键详解,引用自:...二、外键详解:引用自https://www.cnblogs.com/programmer-tlh/p/5782451.html三、mysql列属性。(主键,唯一键,自增等)引用自:https://blog.csdn.net/J0...
  • MySQL入门(三)字段的修改、添加、删除修改表字段使用alter table语句,谨记!create table tf1(id int primary key auto_increment,x int,y int);# 修改alter table tf1 modify x char(4) default '';alter table ...
  • MySQL——主键与外键

    2021-11-22 17:34:48
    1.1 什么是主键和外键 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键。 比如: 学生表(学号,姓名,性别,班级) 其中每个学生的学号是...
  • 数据库的主键与外键

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

    千次阅读 2019-10-29 10:55:07
    **关键词:外键 | 索引 | InNoDB和MyISAM | 引用 | Mysql** **设置外键的目的:保证数据的一致性!**
  • 数据库之主码和外码

    万次阅读 多人点赞 2019-04-24 21:29:34
    想要明白主码和外码的概念前,需要先对域和笛卡儿积概念有一个彻底的理解。请阅读的童靴务必耐心~O(∩_∩)O 1.域 定义:域是一组 具有相同数据类型值的 集合。(域就是集合,不过集合里的元素是相同的数据类型) ...
  • SQL SERVR 创建添加外键

    千次阅读 2021-12-10 20:13:27
    【参考】创建外键关系 - microsoft : ...在新表中创建外键约束 -- 代码引用自 https://docs.microsoft.com/zh-cn/sql/relational-databases/tables/create-foreign-key-relat.
  • MySql外键设置详解

    千次阅读 2021-01-18 19:18:05
    外键的作用,主要有两个:一个是让数据库自己通过外键来保证数据的完整性和一致性一个就是能够增加ER图的可读性有些人认为外键的建立会给开发时操作数据库带来很大的麻烦.因为数据库有时候会由于没有通过外键的检测而...
  • 外键创建方式

    千次阅读 2020-10-23 10:12:54
    外键 创建方式一:创建表时加入外键 -- 创建grade表 CREATE TABLE `grade`( `gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年级id', `grandename` VARCHAR(50) NOT NULL COMMENT '年级名称', PRIMARY ...
  • Oracle 外键

    2021-05-07 07:14:47
    外键用于另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。 Oracle 外键创建 在Oracle数据库中,外键是强制实施参照完整性的一种方式,使用外键就意味着一个表中的值在另一个表中也必须出现。 ...
  • mysql外键设置

    2012-08-29 09:43:32
    mysql外键的设置,使用。添加外键的格式: ALTER TABLE yourtablename ADD [CONSTRAINT 外键名] FOREIGN KEY [id] (index_col_name, ...) REFERENCES tbl_name (index_col_name, ...) [ON DELETE {CASCADE | ...
  • 查看外键名称查看数据库外键名字

    千次阅读 2019-10-29 12:46:35
    我们要进行删除外键时,需要知道外键的名字,那么如何查看数据库外键呢?有2种方式查看: 1.过查看表的方式查看外键名字; 2.通过mysql自带的系统表查看外键。 更多精彩请访问本文源地址: ...
  • MYSQL外键(Foreign Key)的使用在MySQL 3.23.44版本后,InnoDB引擎类型的表支持了外键约束。外键的使用条件:1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持);2.外键...
  • 添加外键

    2020-08-18 15:55:24
    alter table `表名` add constraint 自定义外键名 foreign key (外键字段) references `关联表名`(`关联字段`); 示例: # 添加外键: `Score` 表中的 `SubjectId`字段 关联 `Subject` 表的 `SubjectId` 字段 alter ...
  • 在创建表时设置外键约束-在修改表时添加外键约束-删除外键约束二、内外连接查询(1)inner join内连接查询(2)left\right join连接查询(左连接和右连接)三、Mysql的锁(1)锁的概述(2)MyISAM的锁调度(4)...
  • SQL添加外键

    2021-10-07 20:58:12
    [CONSTRAINT] [外键名] FOREIGN KEY (外键的列名) REFERENCES 主表名(列名) ); []中括号内容可以省略。 创建表结束后添加外键 ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (外键字段) REFERENCES 主表名称...
  • java获取数据库主外键

    2014-02-19 14:56:01
    使用eclipse获取mysql数据库中的表结构以及主外键
  • 我在lesson表中没注意,一下设置了2个外键,导致出现了严重的问题,此表因为有外键导致不能删除,但是此表的添加了外键的列导致我查表出现错误的信息:1.lesson表:我现在想删除sid这个列的外键:别的同学的机子都...
  • 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
收藏数 26,563
精华内容 10,625
关键字:

外码与外键

友情链接: csc.rar