精华内容
下载资源
问答
  • 数据库外键怎么设置
    千次阅读
    2022-03-31 21:18:26

    数据库默认引擎是InnoDB,默认支持外键设置

    e.g. 创建表1

    create table 表1(

    表1.主键 字段类型 primary key,

    创建的一些字段。。。。

    创建表2 create table 表2(

    表2.主键 字段类型 primary key,

    创建表2 的一些字段

    创建关联字段的表3

    create table 表3 (

    表3.主键 字段类型 primary key AUTO_INCREMENT,

    表1.主键 字段类型,

    表2.主键 字段类型,

    grade 字段类型 not null,

    INDEX(表1.主键),FOREIGE KEY(表1.主键)REFERENCES 表1的名字 (表1的主键),

    INDEX(表2.主键),FOREIGE KEY(表2.主键)REFERENCES  表2的名字  (表2的主键),

    更多相关内容
  • 一·首先是外键的作用与设置  保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值!  例如:  a b 两个表  a表中存有客户号,客户名称  b表中...
  • 数据库外键理论及MySQL外键实现规定

    千次阅读 2021-12-17 10:35:30
    1. 关系数据库外键概念理论(大学时学习的概念) 教材是:王珊,萨师煊老师的数据库系统概论——第五版,这里直接丢截图了。 有三类完整性约束,分别是:实体完整性、参照完整性以及用户定义的完整性。 其中实体...

    1. 关系数据库外键概念理论(大学时学习的概念)

    教材是:王珊,萨师煊老师的数据库系统概论——第五版,这里直接丢截图了。

    在这里插入图片描述

    • 有三类完整性约束,分别是:实体完整性、参照完整性以及用户定义的完整性。
    • 其中实体完整性参照完整性是关系模型必须满足的完整性约束条件,被称作是关系的两个不变性,应该由关系系统自动支持(例如MySQL要负责这部分约束的检查)
    • 用户定义的完整性是应用领域需要遵循的约束条件,体现了具体领域中的语义约束
      • 不做强制检查,最多让人感觉不符合现实或者有点蠢,和程序员不怎么相关😛😛😛
      • 比如:成绩只能是0-100,年龄只能是0-150以内,生日只能是1.1-12.31,类似这种语义约束。

    1.1 实体完整性

    在这里插入图片描述
    主要用来描述,数据库中每行数据都应该是可区分的(有某个属性是唯一的!)


    1.2 ✅ 参照完整性

    在这里插入图片描述

    在这里插入图片描述

    • 可以看到,数据库理论中
    • 假如F属性是一个表R的属性,但是不是主码;属性K是表S的主码。(表R和表S不一定是不同的表)。如果FK对应,则称F是表R的外码,并称表R是参照关系(参照表),表S是被参照关系。
    • 可以去看看1.5 MySQL数据库操作示例

    在这里插入图片描述
    在这里插入图片描述

    • 这里的参照完整性规则,意思就是:如果选课表中的课程id,参照了课程表中的课程id,
    • 那么选课表中的课程id的取值,要么为空,要么就等于 课程表中的课程id中某个值。

    也是:Mysql错误1452 - Cannot add or update a child row: a foreign key constraint fails怎么办?中这个回答的理论依据。
    在这里插入图片描述

    1.3 用户定义完整性

    在这里插入图片描述

    1.4 ✅ 参照完整性的SQL实现

    还是王珊,萨师煊老师的教材,是后面的例子,截图贴上来
    在这里插入图片描述
    主要还是关于参照完整性(外键)这部分的内容

    可以看到,对于学生版Student(Sno)、课程表Course(Cno)和学生选课表SC(Sno,Cno)来说,按照上面的规定,
    在这里插入图片描述
    则,Sno是表SC的外码,SC表是参照关系,被参照表是Student;Cno也是表SC外码,SC表是参照关系,被参照表是Course。

    在这里插入图片描述

    1.5 ✅ MySQL数据库操作示例

    如果是用Navicat设计mysql数据库,那么可视化应该是这样:

    例如,有两个表,分别是poem(诗表)和poet_to_poem(诗人和诗对应表)
    在这里插入图片描述
    poem(诗表)数据
    在这里插入图片描述
    poet_to_poem(诗人和诗对应表)数据
    在这里插入图片描述
    poem(诗表)非空和主键约束在这里插入图片描述
    poet_to_poem(诗人和诗对应表)非空和主键约束

    很明显,poet_to_poem表中的poem_id是引用自poem表,所以可以设置一个外键(对poet_to_poem表设置)。
    在这里插入图片描述
    所以外键是设置在引用了其他表字段的表上!

    设置完之后,ER图显示就是这样,主键是钥匙,外键是个锁扣的形状
    在这里插入图片描述

    1.6 ✅ neo4j中的关系和mysql的外键

    之前在:图数据库初探——4. mysql数据导入neo4j(desktop界面导入)中,由于外键设置错误,所以导入的时候,只导入了节点,没有识别出关系。设置正确后,就可以正确识别关系了,如下:
    在这里插入图片描述
    在这里插入图片描述

    C:\shaiic_work\neo4j_data\relate-data\dbmss\dbms-54e8721d-3337-412a-8b54-d6ccd03b564e\bin\neo4j-admin.bat @C:\Users\HUANGS~1\AppData\Local\Temp\csv-001\neo4j-admin-import-params
    很奇怪,这个命令运行了两次,第一次报错了
    在这里插入图片描述
    另外,重启桌面版之后,这个新建的数据库在对应的DBMS界面没有显示,但是用命令行去看,是可以看到的。

    CALL db.schema.visualization()
    

    在这里插入图片描述
    可以看到,neo4j中的schema导入前mysql的schema是基本一致的(只是关系表,转为了relationship边)


    match (p:Poem)
    return p
    

    在这里插入图片描述
    一个表的主码就作为节点,其他的属性就作为节点的属性。

    2 MySQL中实现的规定

    根据参考,进行关键部分的摘录

    2.1 基本概念

    MySQL支持外键,允许跨表的交叉引用(外键可以是表内,也可以是表外,mysql都支持),外键约束可以帮助保持相关数据的一致性。(被参照表的主键字段删了,对应的参照表的外键也会删掉)

    外键关系包含拥有列的初始值的父表(例如:学生表),以及引用父表中列的值的子表(例如:学生成绩表引用学生表的student_id)。外键约束定义在子表上

    创建表或者修改表时进行外键约束的语法如下(只有这两种时候才可以加外键约束):

    [CONSTRAINT [symbol]] FOREIGN KEY
        [index_name] (col_name, ...)
        REFERENCES tbl_name (col_name,...)
        [ON DELETE reference_option]
        [ON UPDATE reference_option]
    
    reference_option:
        RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT
    

    2.2 ✅ 命名规则

    • 在外键约束的语法中,如果已经对外键命名,即上面的[CONSTRAINT [symbol]] FOREIGN KEYsymbol这个字段有值了,则直接使用这个值作为外键名称
    • 如果CONSTRAINT symbol子句未定义,或CONSTRAINT关键字后未包含符号,
      • 对于InnoDB表,会自动生成约束名称,ibfk是InnoDB Foreign Key的缩写
      • 例如:使用Navicat工具管理mysql数据库。外键的一种常用命名方式是表名_fk_序号,如下,poet表的第一个外键就是:poet_ibfk_1
        在这里插入图片描述
      • 对于NDB表,使用该 FOREIGN KEY index_name值(如果已定义)。否则,会自动生成约束名称。
    • 该值(如果已定义)在数据库中必须是唯一的。重复会 导致类似于以下内容的错误:ERROR 1005 (HY000): Can't create table 'test.fk1' (errno: 121)。 CONSTRAINT symbolsymbol(外键名称在一个数据库中必须唯一)

    这是Mysql错误1452 - Cannot add or update a child row: a foreign key constraint fails怎么办?这个错误下这个答案的依据,只是不太匹配这个报错信息
    在这里插入图片描述


    2.3 ✅ 条件和限制

    外键约束遵循以下条件和限制:

    • 父表和子表必须使用相同的存储引擎,同时子表和父表不能是临时表。

    • 创建外键需要从父表得到 REFERENCES 权限(需要有引用的权限)

    • 外键列和它引用的被参照列必须有相似的数据类型(最好是一模一样或者是可以兼容的),比如整数(INTEGER)和小数(DECIMAL)的符号以及固定精度必须一致;如果是字符串类型,则对长度的规定可以不一致,对于非二进制(字符)字符串列,字符集和排序规则必须相同。

      • 类似下面这样 在这里插入图片描述
    • MySQL支持外键引用同一个表中的另一列(主键),但是列不能对列自身有引用。在这种情况下,子表记录指的是同一个表中的依赖记录。

      • 比如,如果学生组,包含学生id属性,小组长/班长id属性,那么后者其实就会引用前者,所以支持同一个表中不同列的引用,但是不支持列对列自身的引用
    • MySQL要求外键和引用的列上都有索引,这样进行外键检查的时候就不需要扫描整个表,可以加快速度。在引用表中,外键引用的那列必须要用索引,如果没有,就会自动创建。

    • 对于InnoDB来说,允许外键引用含有索引的列或者列组(好几列),不过,在引用的数据表上,其中引用的第一列上必须有相同的索引。

      • 关于索引这部分,其实可以观察一下,在创建外键之后,会自动对外键的列添加索引。(确实是引用表的外键上有索引,被引用的则没有)
        在这里插入图片描述
    • 外键关系中的表不能更改为使用另一个存储引擎。要更改存储引擎,您必须首先删除所有外键约束。简单来说,还是建立外键关系的两个表,必须使用同一种存储引擎

    2.3.1 存储引擎查询

    • 关于存储引擎,其实就是这个:
      在这里插入图片描述
    • 也可以使用sql语句查询某个表的存储引擎
      # 查询某个数据库中所有表的存储引擎
      show table status from 库名;
      # 查询某个特定表的存储引擎
      show table status from 库名 where name='表名'
      在这里插入图片描述

    参考:

    ✅mysql5.7文档中文翻译(显示的是5.7 但是对应章节都不一样,参考对照着看,另外,有点像机翻,哈哈。)


    其他可能有用的信息

    mysql5.1文档的中文翻译


    实践的结果(从程序员的角度来看):

    展开全文
  • Mysql数据库5.5以后默认的表类型就是INNOB的,默认支持外键设置,现以学生选课表为例说明外键的设置格式。第一张学生表:create table student(sid int primary key ,sname varchar(45) not null,ssex varchar(2) ...

    Mysql数据库5.5以后默认的表类型就是INNOB的,默认支持外键设置,现以学生选课表为例说明外键的设置格式。

    第一张学生表:

    create table student

    (sid int primary key ,

    sname varchar(45) not null,

    ssex varchar(2) not null,

    sdept varchar(10) not null,

    sage int(3) ,

    sadss varchar(45)

    )

    第二张课程表:

    create table course

    (

    cid int primary key ,

    cname varchar(50) not null,

    ccredit int(3)

    )第三张选课表:

    create table studCourse

    (

    stuCourseId int primary key AUTO_INCREMENT,

    sid int,

    cid int ,

    grade int not null,

    INDEX (sid), FOREIGN KEY (sid) REFERENCES student(sid),

    INDEX (cid), FOREIGN KEY (cid) REFERENCES course(cid)

    )其中选课表中有两个外键分别指向学生表和课程表。

    展开全文
  •  对于主/外键/索引来说,在一些开发团队中被认为是处理数据库关系的利器,也被某些开发团队认为是处理某些具体业务的魔鬼,您的观点呢?在实际应用中您会采取哪种方式?  大家共同观点:  主键和索引是不可...
  • 什么是数据库外键?

    万次阅读 2021-04-10 21:17:42
    外键就是一个表中的一个字段引用了另一个表中的主键,引用的表叫做子表,被引用的表叫做主表,外键是一种约束,描述的是表之间的关系。

    外键

    在这里插入图片描述
    在这里插入图片描述
    Teacher_id就是student的外键
    Teacher是主表,student是子表(从表)

    外键就是一个表中的一个字段引用了另一个表中的主键,引用的表叫做子表,被引用的表叫做主表,外键是一种约束,描述的是表之间的关系。
    讲师:https://zhidao.baidu.com/usercenter?uid=db874069236f25705e79f91c&role=pgc

    主键、外键、索引的区别

    主键、外键和索引的区别?
    定义:
    主键:唯一标识一条记录,不能有重复的,不允许为空

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

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

    作用:

    主键:用来保证数据完整性

    外键:用来和其他表建立联系用的

    索引:是提高查询排序的速度

    个数:

    主键:主键只能有一个

    外键:一个表可以有多个外键

    索引:一个表可以有多个唯一索引

    展开全文
  • Django 学习,数据库外键设置 model.ForeignKey() TypeError: init() missing 1 required positional argument: ‘on_delete’ 建立外键的时候碰到上述报错 class Student(models.Model): s_name = models....
  • mysql数据库外键的作用

    千次阅读 2022-05-23 09:14:46
    SQL的主键和外键的作用: 外键取值规则:空值或参照的主键值。... 定义主键和外键主要是为了维护关系数据库的完整性,总结一下: 一、主键是能确定一条记录的唯一标识,比如,一条记录包..
  • 数据库外键约束的优点和缺点

    千次阅读 2021-09-25 23:35:33
    1,由数据库自身保证数据一致性,完整性,更可靠,因为程序很难100%保证数据的完整性,而用外键即使在数据库服务器当机或者出现其他问题的时候,也能够最大限度的保证数据的一致性和完整性。 eg:数据库和应用是一...
  • 其实这个话题是老生常谈,很多人在工作中确实也不会使用外键。包括在阿里的JAVA规范中也有下面这一条: 【强制】不得使用外键与级联,一切外键概念必须在应用层解决。 但是呢,询问他们原因,大多是这么回答的: ...
  • MySql外键设置详解

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

    千次阅读 2022-03-28 00:20:18
    一:)在所想要设置为主键的列上单击右键,点击设置为...二:)设置外键单击右键选择 点击添加 点击设计器 点击表和列规范 后面的框中点一下,就会出现后面的三个点的按钮,点击三个点图标的那个按钮。 ...
  • 数据库SQL外键设置

    千次阅读 2021-01-31 18:03:40
    创建约束 alter table user_relation add CONSTRAINT `fk_deleteUser` FOREIGN KEY (`account`) REFERENCES `sys_user` (`... 表名 外键名 表字段 外键关联表 外键关联字段 删除时 级联模式 更新时 不做任何操作
  • 阻止执行 ...主表修改主键值,连带从表相关行的外键值一起修改。两种方法提供给用户选择。无论选取哪种方法,从表里都* 不会有多余行。从另一个角度理解,用拒绝同一事物在从表中的标志与主表不一致来实现
  • 如何设置数据库中的外键

    万次阅读 2021-01-30 08:19:41
    展开全部创建数据库时就是有主键的创建了主键,但是表之间的关系没有联系,要建数据库关系图只e69da5e887aa62616964757a686964616f31333365653739有主键没有外键时不行的。建外键的前提是此外键必须是另外一个表的...
  • 达梦数据库
  • 使用过或者接触过数据库外键的开发者,有时候删数据就能够体会到一种欲生欲死的感觉,各种表关联,导致了要删某张表的数据就一定要先删除外键关联的那张表中对应的数据,一层层的删除下来,烦的一批。不过使用数据库...
  • 数据库外键ForeignKey

    2021-03-11 22:33:23
    外键(foreign key)的使用及其优缺点 要不要使用外键(foreign key )? MYSQL外键的使用以及优缺点 外键是什么 如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。由此可见,外键...
  • 数据库外键时,可能导致热更新后不能正常使用,无法运行,只有重启服务才正常,从而达不到热更新目的 3.耦合度 外键的使用物理关联,导致耦合度增加 4.难以分库分表 在大型互联网项目中,如果要做分库,当存在...
  • 首先定义主表的主键 选择SQL Server Management Studio目录树中数据库目录下的数据库关系图 在快捷菜单中选择新建数据库关系图选项 进入添加表界面从可用表中选择要添加到关系图中的表 单击添加按钮然后单击关闭 在...
  • 数据库语句怎么加外键

    千次阅读 2021-01-30 09:38:46
    展开全部为已经添加好的数据表添加外键:语法:alter table 表名 add constraint FK_ID foreign key(你的外键字段名) REFERENCES 外表表名(对应的表的32313133353236313431303231363533e59b9ee7ad9431333363386130...
  • SQL数据库外键代码

    千次阅读 2021-01-18 19:15:29
    子表(test_student)创建一个外键, alter表TEST_STUDENT 添加约束fk_class_id外键(CLASS_ID) 参考test_class(CLASS_ID); 扩展资料: 1.高可用性: 分布式组织的可扩展性,决策支持的数据仓库功能,与...
  • 必学的mysql外键设置方式

    千次阅读 2021-12-28 09:13:45
    外键的作用 保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值! 例如: a b 两个表 a表中存有 客户号,客户名称 b表中存有 每个客户的订单 有了...
  • 你好,这是【一文一点】的第1篇文章,不拘泥于篇幅字数,用一篇文章说清一个知识点。有的SQL规约是这么说的:【强制】不得使用外键与级联,一切外键概念必须在应用层解决。那先复习下是什么...
  • 一、设置外键的作用与好处 可用于检查参照完整性。...可以设置级联操作,外键来源删除和修改时数据库会自动进行级联删除和修改。 二、设置外键时四个选项的含义 RESTRICT:表示阻止级联执行 NO ACT.
  • 为什么禁用数据库外键外键带来的好处带来的不便 一带来的不便 二带来的不便 三带来的不便 四最后说下 外键带来的好处 数据一直性检查由数据库保证 带来的不便 一 每次增删改时都要考虑到外键约束,在调试接口的时候...
  • 2个表;人员表,订单表; 创建人员表,pid为主键;Sqlite的主键自增长必须为integer,不能为int; 创建订单表;字段: oid,orderno, pid;...订单表中的 pid 列指向人员表中的pid列;...sqlite外键的写法:.
  • 数据库外键 附数据和代码

    千次阅读 2018-05-14 23:46:06
    数据库外键定义: 数据库外键作用: 数据库外键和主键的区别: 数据库外键demo; DROP schema IF EXISTS `demo`; CREATE schema demo;
  • 一、设置外键的作用与好处 ...可以设置级联操作,外键来源删除和修改时数据库会自动进行级联删除和修改。 二、设置外键时四个选项的含义 RESTRICT:表示阻止级联执行 NO ACTION:表示无操作 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 231,409
精华内容 92,563
关键字:

数据库外键怎么设置