精华内容
下载资源
问答
  • 主要介绍了MySQL使用外键实现级联删除与更新的方法,详细分析了mysql数据库与表的创建、数据插入、查询以及外链的使用与级联操作相关技巧,需要的朋友可以参考下
  • MySQL通过外键约束来保证表与表之间的数据的完整性和准确性。这篇文章还通过外键的使用条件和外键的好处定义语法方面介绍了mysql外键使用及说明,非常不错,具有参考借鉴价值,需要的朋友一起看下吧
  • 主要介绍了MySQL无法创建外键的原因及解决方法,然后在文中给大家及时了MySQL无法创建外键、查询外键的属性知识,感兴趣的朋友一起看看吧
  • 如果表A的主关键字是表B的字段,则该字段称为表B的外键,表A称为主表,表B称为从表。  外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常...
  • MySQL:MySQL不能删除外键,抱错Error on rename of ./ruler/test2child to ./ruler/#sql2-298-92 (errno: 152) 曾经这是MySQL的一个bug,但是现在只是MySQL的一个不友好的地方。 例子如下: mysql> ALTER TABLE ...
  • Mysql外键使用

    2020-07-07 22:04:42
    Mysql外键使用 外键是一个非常非常好用的一个东西,同时也是很多种关系数据库都有的一种功能,简单的来说就是可以将两张表之间建立一个关联,可以做到操作一张表的时候,另外一个表的数据也会同步发生变化。 ...

    Mysql外键的使用

    外键是一个非常非常好用的一个东西,同时也是很多种关系数据库都有的一种功能,简单的来说就是可以将两张表之间建立一个关联,可以做到操作一张表的时候,另外一个表的数据也会同步发生变化。

    例子:
    一个学生表里面有学生的所有信息,其中有一个字段是班级id,又有一个班级表,记录着所有的班级信息,按照逻辑来说,如果我们删除了班级
    表里面的某个班级,学生表里面是这个班级id的信息就应该修改。
    

    以上的例子我们如果是使用程序是可以正常的完成的,先删除这个班级,再在学生表里将是这个班级的学生信息的班级id字段进行修改,分为这两部。 但是这个如果我们使用了外键,只需要一步就可以了呀,关联了外键 只要一个有修改,另外一个会自动的更新过去,显然这个是更加符合程序的。也更轻松

    使用前的细节
    1. 数据库在选用存储引擎的时候要选择适配外键的存储引擎,如mysql的默认存储引擎innodb
    2. 相互关联的外键字段的字段类型必须要保持一致,如学生表的class_id是int类型,那么班级表的class_id的类型最好也要使用int类型,这个十分的重要
    在新表中创建外键约束
    	create table stu_study (
    	  sid int primary key auto_increment,-- 定义Sid  
          sname varchar(15) not null,
          course_id int default null,  -- 定义课程id 课程id是外键所以要与关联的主表的字段类型保持一致
          constraint stu_study_class -- 一个表里可能有多个表之间关联,所以外键需要起一个名字
          foreign key (class_id) -- 关联的外键名
          references classes(id)  -- 关联的主表和主表的字段
          on delete cascade  -- 当删除的时候触发
        )engine=InnoDB default charset utf8  -- 默认存储引擎和编码的字符串
    

    在这里插入图片描述

    在已有的表中进行外键的添加和删除
    1. 删除外键
      ···
      – 删除外键(外键约束)
      alter table stu_study drop foreign key stu_study_classes;
      ···
      在这里插入图片描述
      删除外键是通过在表格中根据外键名进行删除, 这个也是间接的让我们知道了外键名是不能够重复的。
    2. 添加外键
    	-- 添加外键
      alter table stu_study add
      constraint stu_study_classes  -- 外键名 是一定不能够重复的,通常会用关联的两个表名进行命名
      foreign key(course_id)
      references classes(id)
      on delete cascade;
    

    在这里插入图片描述
    在已有的表中添加外键和创建表的时候添加外键是非常像的,有个细节就是他要使用contraint 外键名 来设置外键的名称
    外键的增加修改我们会发现和表格字段的增加修改是很像的,使用的关键字都是add drop等等

    关联动作的操作

    子表
    在这里插入图片描述
    主表
    在这里插入图片描述
    字表和子表我们可以简单的理解成,设置了外键的那个表就是子表
    关联动作有很多种,如 cascade,set Nullno action这三个都是在设置外键的时候设置关联动作,如
    在这里插入图片描述
    表示的是在删除时的执行的动作,主要区别如下:

    1. cascade 删除主表的某个字段的时候,子表含有这个字段的数据会被清空,这个还是属于相对危险的一个操作的
    2. +set null 删除主表的某个字段的时候,子表含有这个字段的这个哪一行的这个字段会用null来显示,但是有个细节就是设置外键的这个字段字段类型就不能设置为not null类型的,否则会报错
    3. no action 这个字段会比较有意思,也就是说当主表要删除某个行的时候,如果外键关联有含有这个主表的外键的字段数据的话,就不会删除成功,系统会直接报错
    关联更新操作

    之前是主要讲了关联删除,是因为外键在使用的时候关联删除操作是使用的比较频繁的,关联更新的频率是相对来说低一点儿的
    关联更新的三个关联操作和删除时一样的,分别是cascade,set null,no action意思是也是一样的,主表某个字段更新了,子表也会更新那个字段!!,主表更新的某条数据,子表的使用的那个数据会变成空,和子表在使用的情况下,主表就不能够更新数据

    	alter table stu_study drop foreign key stu_study_classes;  -- 删除外键
    	-- 添加外键
    	alter table stu_study add 
        constraint stu_study_classes 
        foreign key (course_id) 
        references classes(id) 
        on delete set null -- 一次性设置外键的两种动作
        on update cascade
    

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

    总结
    • 数据库的外键是非常非常好用的一个技术,可以让我们快速的进行表之间的数据的更新
    • 外键可以简单的理解成会自动的替我们做一个数据变动的处理
    展开全文
  • MySQL外键使用详解

    2020-12-15 17:17:05
    (1)只有InnoDB类型的表才可以使用外键mysql默认是MyISAM,这种类型不支持外键约束 (2)外键的好处:可以使得两张表关联,保证数据的一致性和实现一些级联操作; (3)外键的作用: 保持数据一致性,完整性,...
  • 本文介绍在在MySQL数据库定义数据表、设置索引、定义外键、级联等操作。
  • MySQL的外键约束是用来在两个表之间建立链接的,其中一个表发生变化,另外一个表也发生变化。从这个特点来看,它主要是为了保证表数据的一致性和完整性的。 对于两个通过外键关联的表,相关联字段中...4、外键中列的数
  • 下面小编就为大家带来一篇MySQL删除表的时候忽略外键约束的简单实现。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • MySQL中删除一张表或一条数据的时候,出现 [Err] 1451 -Cannot deleteorupdatea parent row: aforeignkeyconstraintfails (...) 这是因为MySQL中设置了foreign key关联,造成无法更新或删除数据。可以通过设置...
  • 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 | ...
  • 附件包含的内容为MySQL数据库关于外键的内容,包括外键定义,作用,添加和删除
  • 本文介绍了在MySQL数据库定义外键的方法。
  • mysql外键设置方式

    万次阅读 多人点赞 2018-08-27 09:54:51
    mysql外键设置方式/在创建索引时,可指定在delete/update父表时,对子表进行的相应操作, 包括: restrict, cascade,set null 和 no action ,set default. restrict,no action: 立即检查外键约束,如果子表有匹配...

    mysql外键设置方式/在创建索引时,可指定在delete/update父表时,对子表进行的相应操作,
    包括: restrict, cascade,set null 和 no action ,set default.

    • restrict,no action:
      立即检查外键约束,如果子表有匹配记录,父表关联记录不能执行 delete/update 操作;

    • cascade:
      父表delete /update时,子表对应记录随之 delete/update ;

    • set null:
      父表在delete /update时,子表对应字段被set null,此时留意子表外键不能设置为not null ;

    • set default:
      父表有delete/update时,子表将外键设置成一个默认的值,但是 innodb不能识别,实际mysql5.5之后默认的存储引擎都是innodb,所以不推荐设置该外键方式。如果你的环境mysql是5.5之前,默认存储引擎是myisam,则可以考虑。

    选择set null ,setdefault,cascade 时要谨慎,可能因为错误操作导致数据丢失。

    如果以上描述并不能理解透彻,可以参看下面例子。

    country 表是父表,country_id是主键,city是子表,外键为country_id,和country表的主键country_id对应。

    create table country(
    	country_id smallint unsigned not null auto_increment,
    	country varchar(50) not null,
    	last_update timestamp not null default current_timestamp on update current_timestamp,
    	primary key(country_id)
    )engine=INNODB default charset=utf8;
    
    CREATE TABLE `city` (
      `city_id` smallint(5) unsigned NOT NULL auto_increment,
      `city` varchar(50) NOT NULL,
      `country_id` smallint(5) unsigned NOT NULL,
      `last_update` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
      PRIMARY KEY  (`city_id`),
      KEY `idx_fk_country_id` (`country_id`),
      CONSTRAINT `fk_city_country` FOREIGN KEY (`country_id`) REFERENCES `country` (`country_id`)  on delete restrict   ON UPDATE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    

    这里写图片描述
    这里写图片描述

    例如对上面新建的两个表,子表外键指定为:on delete restrict ON UPDATE CASCADE 方式,在主表删除记录的时候,若子表有对应记录,则不允许删除;主表更新记录时,如果子表有匹配记录,则子表对应记录 随之更新。
    eg:

    insert into country values(1,'wq',now());
    select * from country;
    insert into city values(222,'tom',1,now());
    select * from city;
    

    这里写图片描述

    delete from country where country_id=1;
    update country set country_id=100 where country_id=1;
    select * from country where country='wq';
    select * from city where city='tom';
    

    这里写图片描述

    展开全文
  • mysql建立外键

    2021-01-20 00:11:20
    外键表名>(外键列名) 事件触发限制: on delete和on update , 可设参数cascade(跟随外键改动), restrict(限制外表外键改动),set Null(设空值),set Default(设默认值),[默认]no action 例如: ...
  • 如果公共关键字在一个关系是主关键字,那么这个公共关键字被称为另一个关系的外键。由此可见,外键表示了两个关系之间的相关联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。...

    如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。由此可见,外键表示了两个关系之间的相关联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。外键又称作外关键字。

    优点:

    1、由数据库自身保证数据一致性,完整性,更可靠,因为程序很难100%保证数据 的完整性,而用外键即使在数据库服务器当机或者出现其他问题的时候,也能够最大限度的保证数据的一致性和完整性。

    eg:数据库和应用是一对多的关系,A应用会维护他那部分数据的完整性,系统一变大时,增加了B应用,A和B两个应用也许是不同的开发团队来做的。他们如何协调保证数据的完整性,而且一年以后如果又增加了C应用呢?

    2、有主外键的数据库设计可以增加ER图的可读性,这点在数据库设计时非常重要。

    3、外键在一定程度上说明的业务逻辑,会使设计周到具体全面

    4、除非能证明触发器的性能和可维护性比外键更优,否则凭什么一定要否定外键呢?使用应用程序来维护数据完整性,则是严重降低数据库安全性的一种做法。连接字符串里如果有uid和pwd或者类似的这两个东西,可以使用工具获取你数据库的帐号。因为每次建立数据库联接的时候都会在网线上以标准格式传递这些信息。从此编码内的任何保证都是空的。

    5、不使用外键,会导致数据冗余,在级联最底层的表可能会重复好几层的数据。必然导致最底层的表数据量翻倍,IO瓶颈是数据库性能瓶颈之一

    缺点:

    1、可以用触发器或应用程序保证数据的完整性(外键可代替)

    2、过分强调或者说使用主键/外键会平添开发难度,导致表过多等问题

    3、不用外键时数据管理简单,操作方便,性能高(导入导出等操作,在insert, update, delete 数据的时候更快)

    eg: 在海量的数据库中想都不要去想外键,试想,一个程序每天要insert数百万条记录,当存在外键约束的时候,每次要去扫描此记录是否合格,一般还不止一个 字段有外键,这样扫描的数量是成级数的增长!我的一个程序入库在3个小时做完,如果加上外键,需要28个小时!

    4、几乎不用,抛开性能不说,开发、测试、部署、实施,以及维护的时候都带来不少问题。数据完整性几乎都是业务的要求,理应由业务部分负责维护,而不是依赖数据库访问量较大的web应用,以及有一定规模的企业应用,都关注伸缩性和性能问题,各种形式的垂直、水平切分运用越来越多,外键、触发器、存储过程之类的基本属禁区

    建立外键
    假设我们有张主表user表,表结构如下:
    在这里插入图片描述
    我们希望以id这个字段作为别的表的外键关联一张子表balance。 balance表记录着user的账户余额以及币种。表结构如下
    在这里插入图片描述
    主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性

    外键:是另一表的主键, 外键可以有重复的, 可以是空值,用来和其他表建立联系用的。所以说,如果谈到了外键,一定是至少涉及到两张表。例如下面这两张表:
    在这里插入图片描述
    如果大家分不清主外键表记住:有外键字段的是外键表,没有外键字段,但与外键表有关联是主键表

    注意:
    1、外键字段在创建的时候就应该与主表的类型完全一致(长度啊等),否则创建外键会报错

    2、外键表是不能插入主表不存在的数据。

    3、外键表不能删除已经关联上的主表数据。
    作用:保持数据的一致性、完整性

    为何说外键有性能问题:

    1.数据库需要维护外键的内部管理;

    2.外键等于把数据的一致性事务实现,全部交给数据库服务器完成;

    3.有了外键,当做一些涉及外键字段的增,删,更新操作之后,需要触发相关操作去检查,而不得不消耗资源;

    4.外键还会因为需要请求对其他表内部加锁而容易出现死锁情况;

    数据库外键的使用以及优缺点

    摘录网上讨论共同观点:主键和索引是不可少的,不仅可以优化数据检索速度,开发人员还省不其它的工作,
    矛盾焦点:数据库设计是否需要外键。这里有两个问题:一个是如何保证数据库数据的完整性和一致性;二是第一条对性能的影响。

    正方观点: 1,由数据库自身保证数据一致性,完整性,更可靠,因为程序很难100%保证数据的完整性,而用外键即使在数据库服务器当机或者出现其他问题的时候,也能够最大限度的保证数据的一致性和完整性。 eg:数据库和应用是一对多的关系,A应用会维护他那部分数据的完整性,系统一变大时,增加了B应用,A和B两个应用也许是不同的开发团队来做的。他们如何协调保证数据的完整性,而且一年以后如果又增加了C应用呢? 2,有主外键的数据库设计可以增加ER图的可读性,这点在数据库设计时非常重要。 3,外键在一定程度上说明的业务逻辑,会使设计周到具体全面。

    反方观点: 1,可以用触发器或应用程序保证数据的完整性 2,过分强调或者说使用主键/外键会平添开发难度,导致表过多等问题 3,不用外键时数据管理简单,操作方便,性能高(导入导出等操作,在insert, update, delete 数据的时候更快)eg:在海量的数据库中想都不要去想外键,试想,一个程序每天要insert数百万条记录,当存在外键约束的时候,每次要去扫描此记录是否合格,一般还不止一个字段有外键,这样扫描的数量是成级数的增长!我的一个程序入库在3个小时做完,如果加上外键,需要28个小时!

    结论: 1,在大型系统中(性能要求不高,安全要求高),使用外键;在大型系统中(性能要求高,安全自己控制),不用外键;小系统随便,最好用外键。 2,用外键要适当,不能过分追求 3,不用外键而用程序控制数据一致性和完整性时,应该写一层来保证,然后个个应用通过这个层来访问数据库。

    ————————————————
    参考原文链接:
    https://blog.csdn.net/u014590757/article/details/79590348
    https://www.cnblogs.com/bushui/p/11757603.html

    展开全文
  • mysql 关闭外键

    2019-12-24 20:27:15
    MySQL中删除一张表或一条数据的时候,出现 [Err] 1451 -Cannot delete or update a parent row: a foreign key constraint fails (…) 这是因为MySQL中设置了foreign key关联,造成无法更新或删除数据。可以通过...

    在MySQL中删除一张表或一条数据的时候,出现

    [Err] 1451 -Cannot delete or update a parent row: a foreign key constraint fails (…)
    这是因为MySQL中设置了foreign key关联,造成无法更新或删除数据。可以通过设置FOREIGN_KEY_CHECKS变量来避免这种情况。

    我们可以使用

    SET FOREIGN_KEY_CHECKS=0;
    

    来禁用外键约束.

    之后再用
    SET FOREIGN_KEY_CHECKS=1;
    来启动外键约束.

    查看当前FOREIGN_KEY_CHECKS的值可用如下命令

    SELECT  @@FOREIGN_KEY_CHECKS;
    
    展开全文
  • mysql添加外键语句

    千次阅读 2020-03-04 09:46:09
    1.添加外键约束:altertable从表addconstraint外键(形如:FK_从表_主表)foreignkey(从表外键字段)references主表(主键字段); 如:alter table t_book add constraint `fk` foreign key (`bookTypeId`) references...
  • MYSQL如何使用外键

    2020-11-09 23:02:46
    这里写自定义目录标题MYSQL如何使用外键一、增加外键二、删除外键三、外键作用四、外键约束新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个...
  • MySQL 语句外键 连接

    千次阅读 2019-02-27 14:26:46
    外键 定义: 外键是指引用另一个表的一列或多列,被引用的列具有主键约束或唯一约束。 目的: 外键用于建立和加强两个...在MySql中只有 InooDB 类型的表才支持外键。 (2)定义外键名时,不能加引号。 如 constrai...
  • 1、安装mysql有InnoDB的插件扩展 ./configure –prefix=/usr/local/mysql –with-plugins=csv,innobase,myisam,heap,innodb_plugin 2、找不到主表 引用的列 3、主键和... 您可能感兴趣的文章:mysql外键(Foreign Key)
  • MySQL 删除外键字段

    千次阅读 2018-08-27 20:38:49
    记录一下踩的坑,同一个数据库下两个表,举个例子 user_info 表的 username字段设置为外键,关联了 表user_pwd的主键字段 user,现在因为重建表结构等原因,要把这个外键删除,这里的删除语法为:  ...
  • MYSQL外键使用以及优缺点

    千次阅读 2019-05-07 15:58:31
    矛盾焦点:数据库设计是否需要外键。这里有两个问题:一个是如何保证数据库数据的完整性和一致性;二是第一条对性能的影响。 正方观点: 由数据库自身保证数据一致性,完整性,更可靠,因为程序很难100%保证数据的...
  • Mysql中取消外键约束

    千次阅读 2018-10-03 10:00:42
    Mysql中取消外键约束 ** Mysql中如果表和表之间建立的外键约束,则无法删除表及修改表结构。 解决方法是在Mysql中取消外键约束: SET FOREIGN_KEY_CHECKS=0; 然后将原来表的数据导出到sql语句,重新创建此表后,再把...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 119,239
精华内容 47,695
关键字:

mysql中的外键怎么使用

mysql 订阅