外键

表与表之间建立关系

我们两清 提交于 2019-11-27 20:31:35
外键 前戏之一对多关系 # 定义一张部门员工表 id name gender dep_name dep_desc 1 jason male 教学部 教书育人 2 egon male 外交部 漂泊游荡 3 tank male 教学部 教书育人 4 kevin male 教学部 教书育人 5 owen female 技术部 技术能力有限部门 """ 把所有数据都存放于一张表的弊端 1.组织结构不清晰 2.浪费硬盘空间 3.扩展性极差 """ # 上述的弊端产生原因类似于把代码全部写在一个py文件中,你应该怎么做?>>>解耦合!将上述一张表拆成员工和部门两张表! # 分析表数据之间的关系:多个用户对应一个部门,一个部门对应多个用户。禁止一个用户对应多个部门 # 如何查找表与表之间的关系 ''' 以员工和部门表为例。查找表关系需要做到换位思考(站在两边去找表关系) 先站在员工表: 找员工表的多条数据能否对应部门表的一条数据 翻译: 多个员工能否属于一个部门 可以!之后不能直接下结论,还需要站在部门表的角度再确认关系 再站在部门表: 找部门表的多条数据能否对应员工表的一条数据 翻译: 多个部门能否有同一个员工 不可以! 只有站在两边表的角度都分析过了,才能够下结论 员工表单向多对一部门表 ''' 一对多(Foreign Key) # 如何查找表与表之间的关系 """ 老师与课程表 1

表与表之间建立关系

泄露秘密 提交于 2019-11-27 20:31:11
一、表的概念与分类   主要通过外键关键字:pirmary key 来建立连系 1、表与表之间的关系可以分为三种:一对多,多对多,一对一的关系   建立表关系的原因?: 2、 针对数据量大的情况下讨论   1:表的结构不清晰(一张表中涵盖多种数据)   2:浪费硬盘空间(有重复的数据)   3:表的扩展性极差(不便于增加,修改,删除等操作) 二、表与表的关系:一对多 例如:一个公司的员工和部门之间的连系,把员工和部门分别抽离出来分析   (1)先站在员工表看能否有多个员工对应一个部门>>>一个部门能否有多个员工(可以)   (2)再站在部门表看能否有多个部门对应一个员工>>>一个员工能否属于多个部门(不可以) 结论:员工表和部门表之间的关系是“一对多”的关系(一对多或者多对一) 根据id索引来寻找匹配的内容先通过列表的形式,把一张完整的表切分出来,分析它们之间的关系多对一还是多对多就可以看出情况,换位思考! foreign key:外键约束   1、创建表的时候,必须先创建被关联的表   2、插入数据的时候,也必须先插入被关联表的数据(先后顺序不能颠倒,不然会报错!) 代码如下:   建表: # 先建被关联的表 create table dep( id int primary key auto_increment, dep_name varcher(32), dep_desc

hibernate多对多查询

江枫思渺然 提交于 2019-11-27 19:03:02
多对多 多对多其实也分单向多对多,和双向多对多,但是单向多对多比较简单,并且用的最多的就是双向多对多了,知道了双向多对多,单向多对多就非常简单,所以我们直接讲双向多对多 生活中有很多例子就是双向多对多的,最简单和贴近我们生活的,    1、学生和选课之间的关系了,学生可以选择多门课程,课程可以被多个学生选择,    2、学生和选老师之间的关系,学生可以选择多个老师,老师可以有许多学生,    3、在淘宝中购物,一件商品能被多个人选择,一个人能够选择多个商品    4、....   很多这种多对多关系,就拿学生和老师这个例子来讲解吧 要保存多对多的关系,两张表是不够的,需要增加第三张表来表示这种关系,来看下面的数据库关系图。 这个图意思就是用t_s这个中间表来保存student和teacher这两张表的关系,并且t_s是联合主键,同时也是外键,指向student的id和teacher的id   有人肯定会觉得为什么还要用第三张表,不直接使用两个外键,你指向我,我指向你这样呢,这样会暴露出一个很大的问题,如果学过数据库就应该会知道,这样的两张表相互关联,那么这两张表的关系就固定在那里了,删哪个表就不能删,这个都市小事,当你在查询一个表中数据时,会造成死循环,你查了我,我又在查你,一直重复下去。 实体类和映射配置 Student持久化类和Student.hbm.xml /

外键的变种 三种关系

孤街醉人 提交于 2019-11-27 19:02:49
原文章: https://www.cnblogs.com/majj/p/9169416.html 介绍 因为有foreign key的约束,使得两张表形成了三种了关系: 多对一 多对多 一对一 找出两张表之间的关系 分析步骤: #1、先站在左表的角度去找 是否左表的多条记录可以对应右表的一条记录,如果是,则证明左表的一个字段foreign key 右表一个字段(通常是id) #2、再站在右表的角度去找 是否右表的多条记录可以对应左表的一条记录,如果是,则证明右表的一个字段foreign key 左表一个字段(通常是id) #3、总结: #多对一: 如果只有步骤1成立,则是左表多对一右表 如果只有步骤2成立,则是右表多对一左表 #多对多 如果步骤1和2同时成立,则证明这两张表时一个双向的多对一,即多对多,需要定义一个这两张表的关系表来专门存放二者的关系 #一对一: 如果1和2都不成立,而是左表的一条记录唯一对应右表的一条记录,反之亦然。这种情况很简单,就是在左表foreign key右表的基础上,将左表的外键字段设置成unique即可 表的三种关系 一对多 或者 多对一(书和出版社) 一对多(或多对一):一个出版社可以出版多本书。看图说话。   关联方式:foreign key create table press( id int primary key auto_increment

Mysql外键约束的要求

不羁岁月 提交于 2019-11-27 18:54:57
1、父表和子表必须使用相同的存储引擎,而且禁止使用临时表。 2、数据表的存储引擎只能为InonoDB。 3、外键列和参照列必须具有相似的数据类型。其中数字的长度或是否有符号位必须相同;而字符的长度可以不同。 4、外键列和参照列必须创建索引。如果外键列不存在索引的话,Mysql将自动创建索引。 编辑数据表的默认存储引擎 MYSQL配置文件my.ini default -storage-engine= INNODB 验证外键列和参照列的数据类型应该相同的问题。 比如创建一张省份表和用户表,用户的身份外键引用省份表的id create table province( id smallint unsigned not null primary key auto_increment, pname varchar ( 20 ) not null ); show create table province// 查看表存储引擎 create table users( id smallint unsigned primary key auto_increment, username varchar ( 20 ) not null , pid bigint, foreign key (pid) references province(id) ); 这样运行会报MYSQL 150错误

MySql外键约束

夙愿已清 提交于 2019-11-27 18:54:44
一、MySql中支持外键的存储引擎只有InnoDB,创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引。 二、创建索引时,可以指定在删除、更新父表时,对子表进行的操作,包括RESTRICT、 CASCADE 、SET NULL、 NO ACTION RESTRICT 和NO ACTION 相同,限制在子表有关联记录的情况下不能更新,CASCADE表示父表在更新或者删除时,更新或者删除对应子表的记录;SET NULL 则表示父表在更新删除时,子表对应字段被SET NULL 后两种方式可能会造成数据丢失。 三、导入多个表的数据时,若忽略舜巡,可以暂时关闭对外键的检查;“SET FOREIGN_KEY_CHECKS = 0" 执行完毕后改为1. 来源: CSDN 作者: talNot 链接: https://blog.csdn.net/hyf_home/article/details/82181697

MySQL外键约束注意事项

北慕城南 提交于 2019-11-27 18:54:21
MySQL外键约束注意事项 MySQL有两种常用的引擎类型:MyISAM和InnoDB。目前只有InnoDB引擎类型支持外键约束。InnoDB中外键约束定义的语法如下: [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name, ...) REFERENCES tbl_name (index_col_name,...) [ON DELETE reference_option] [ ON UPDATE reference_option] reference_option: RESTRICT | CASCADE | SET NULL | NO ACTION 外键的使用需要满足下列的条件: 1. 两张表必须都是InnoDB表,并且它们没有临时表。 2. 建立外键关系的对应列必须具有相似的InnoDB内部数据类型。 3. 建立外键关系的对应列必须建立了索引。 4. 假如显式的给出了 CONSTRAINT symbol,那symbol在数据库中必须是唯一的。假如没有显式的给出,InnoDB会自动的创建。 如果子表试图创建一个在父表中不存在的外键值,InnoDB会拒绝任何 INSERT 或 UPDATE 操作。如果父表试图 UPDATE 或者 DELETE 任何子表中存在或匹配的外键值,最终动作取决于外键约束定义中的 ON

Mysql 为表添加外键约束

限于喜欢 提交于 2019-11-27 18:53:46
sql语句格式: · 添加外键约束: alter table 从表 add constraint 外键(形如: FK_ 从表 _ 主表) foreign key ( 从表 外键字段 ) references 主表 ( 主键字段 ); 如果mysql报错:Error Code: 1215. Cannot add foreign key constraint (foreign keys) 检查 主从表两个字段的属性是否一致 参考: Error Code: 1215. Cannot add foreign key constraint (foreign keys) 来源: CSDN 作者: const伐伐 链接: https://blog.csdn.net/u013905744/article/details/71403045

Mysql中取消外键约束

别来无恙 提交于 2019-11-27 18:52:08
** Mysql中取消外键约束 ** Mysql中如果表和表之间建立的外键约束,则无法删除表及修改表结构。 解决方法是在Mysql中取消外键约束: SET FOREIGN_KEY_CHECKS=0; 然后将原来表的数据导出到sql语句,重新创建此表后,再把数据使用sql导入, 然后再设置外键约束: SET FOREIGN_KEY_CHECKS=1; 来源: CSDN 作者: flysun55 链接: https://blog.csdn.net/flysun55/article/details/82930153

MySQL:简述MySQL外键约束

馋奶兔 提交于 2019-11-27 18:51:50
MySQL:简述MySQL的外键约束 MySQL有两种常用的引擎类型:MyISAM和InnoDB。目前只有InnoDB引擎类型支持外键约束。 一、外键约束的含义: 1. 外键约束对子表的含义:当在子表中insert或update一条数据时,如果在主表中找不到候选键,那么就不允许该操作。 2. 外键约束对主表的含义:当在主表中insert或update数据时,如果主表的候选键对应的有子表的外键值,那么就不允许该操作。    二、外键约束的使用条件: 1. 两张表必须都是InnoDB表,并且它们没有临时表。 2. 建立外键关系的对应列必须具有相似的InnoDB内部数据类型。 3. 建立外键关系的对应列必须建立了索引。    三、外键约束的动作: 如果子表试图创建一个在父表中不存在的外键值,InnoDB会拒绝任何INSERT或UPDATE操作。 如果父表试图UPDATE或者DELETE任何子表中存在或匹配的外键值,最终动作取决于外键约束定义中的ON UPDATE和ON DELETE选项。 InnoDB支持5种不同的动作,如果没有指定ON DELETE或者ON UPDATE,默认的动作为RESTRICT: 1. CASCADE: 从父表中删除或更新对应的行,同时自动的删除或更新自表中匹配的行。ON DELETE CANSCADE和ON UPDATE CANSCADE都被InnoDB所支持。