mysql支持外键吗

mysql支持外键。在MySQL中,外键主要用来建立主表与从表的关联关系,可以为两个表的数据建立连接,约束两个表中数据的一致性和完整性;当主表删除某条记录时,从表中与之对应的记录也必须有相应的改变。一个表可以有一个或多个外键,外键可以为空值,若不为空值,则每一个外键的值必须等于主表中主键的某个值;且外键中列的数目和对应数据类型必须和主表的主键中的相同。

mysql支持外键吗

mysql支持外键。

MySQL外键(FOREIGN KEY)

外键是指定表中与另一个表的另一个字段匹配的字段。外键对相关表中的数据设置了约束,这使MySQL能够保持参照完整性。

外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。

对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)。

主表删除某条记录时,从表中与之对应的记录也必须有相应的改变。一个表可以有一个或多个外键,外键可以为空值,若不为空值,则每一个外键的值必须等于主表中主键的某个值。

我们来看看示例数据库中的以下数据库图。

mysql支持外键吗

我们有两个表:customers和orders, 每个客户都有零个或多个订单,每个订单只能属于一个客户。customers表和orders表之间的关系是一对多的,它orders由customerNumber字段指定的表中的外键建立。customers表中的customerNumber字段与orders表中的customerNumber主键字段相关 。

customers 表称为父表或引用表,orders表称为子表或引用表。

外键可以是一个列或一组列。子表中的列通常引用父表中的主键列。

表可以具有多个外键,子表中的每个外键可以引用不同的父表。

子表中的行必须包含父表中存在的值,例如,orders表中的每个订单记录必须具有customers表customerNumber中存在的值。因此,多个订单可以引用同一个客户,这种关系称为一个(客户)到多个(订单)或一对多。

有时,子表和父表是相同的。外键引用表的主键,例如,下employees表:

mysql支持外键吗

reportTo列是一个外键,它引用employeeNumber作为employees表的主键的列,以反映员工之间的汇报结构,即每个员工向另一个员工汇报,员工可以有零个或多个直接汇报。我们有一个关于自联接教程可以帮助您根据这种表查询数据。

reportTo外键也被称为递归或自引用的外键。

外键强制执行引用完整性,可帮助您自动维护数据的一致性和完整性。例如,您无法为不存在的客户创建订单。

此外,您可以customerNumber在外键的删除操作上设置级联,以便在删除customers表中的客户时,也会删除与客户关联的所有订单。这节省了使用多个DELETE语句 或DELETE JOIN语句的时间和精力。

与删除相同,您还可以在更新操作上为customerNumber外键定义级联,以便在不使用多个UPDATE语句或UPDATE JOIN语句的情况下执行跨表更新。

注意:在MySQL中,InnoDB 存储引擎支持外键,因此您必须创建InnoDB表才能使用外键约束。

mysql定义外键时,需要遵守下列规则:

  • 主表必须已经存在于数据库中,或者是当前正在创建的表。如果是后一种情况,则主表与从表是同一个表,这样的表称为自参照表,这种结构称为自参照完整性。
  • 必须为主表定义主键。
  • 主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。
  • 在主表的表名后面指定列名或列名的组合。这个列或列的组合必须是主表的主键或候选键。
  • 外键中列的数目必须和主表的主键中列的数目相同。
  • 外键中列的数据类型必须和主表主键中对应列的数据类型相同。

为表创建外键

MySQL创建外键语法

以下语法说明如何在CREATE TABLE语句中的子表中定义外键。

CONSTRAINT constraint_nameFOREIGN KEY foreign_key_name (columns)REFERENCES parent_table(columns)ON DELETE actionON UPDATE action

让我们更详细地学习一下语法:

  • CONSTRAINT子句允许您为外键约束定义约束名称。如果省略它,MySQL将自动生成一个名称。
  • FOREIGN KEY子句指定子表中引用父表中主键列的列。你可以把一个外键名称放在FOREIGN KEY子句之后,或者让MySQL为你创建一个名字。请注意,MySQL会自动使用foreign_key_name名称创建索引。
  • REFERENCES子句指定子表中的列所引用的父表及列。在规定的子表和父表的列数FOREIGN KEY和REFERENCES必须相同。
  • ON DELETE子句允许您定义删除父表中的记录时子表中记录的内容。如果省略ON DELETE子句并删除父表中包含子表中记录的记录,MySQL将拒绝删除。此外,MySQL还为您提供操作,以便您可以使用其他选项,例如ON DELETE CASCADE ,要求MySQL删除子表中的记录,当父表中的记录被删除时,记录将引用父表中的记录。如果您不希望删除子表中的相关记录,请改用ON DELETE SET NULL操作。MySQL会将子表中的外键列值设置为NULL删除父表中的记录时,条件是子表中的外键列必须接受NULL值。请注意,如果您使用ON DELETE NO ACTION或ON DELETE RESTRICT操作,MySQL将拒绝删除。
  • ON UPDATE子句使您可以指定更新父表中的行时子表中的行会发生什么。您可以省略ON UPDATE子句,以便在更新父表中的行时让MySQL拒绝对子表中行的任何更新。ON UPDATE CASCADE操作允许您执行跨表更新,并且当更新父表ON UPDATE SET NULL中的行时,操作会将子表中的行中的值重置为值NULL。ON UPDATE NO ACTION或UPDATE RESTRICT行动拒绝任何更新。

MySQL创建表外键示例

下面的示例创建一个dbdemo数据库和两个表:categories和 products.每个类别具有一个或多个产品和每个产品只属于一个类别。products表中的cat_id字段被定义为带有UPDATE ON CASCADE和DELETE ON RESTRICT操作的外键。

CREATE DATABASE IF NOT EXISTS dbdemo; USE dbdemo; CREATE TABLE categories(   cat_id int not null auto_increment primary key,   cat_name varchar(255) not null,   cat_description text) ENGINE=InnoDB; CREATE TABLE products(   prd_id int not null auto_increment primary key,   prd_name varchar(355) not null,   prd_price decimal,   cat_id int not null,   FOREIGN KEY fk_cat(cat_id)   REFERENCES categories(cat_id)   ON UPDATE CASCADE   ON DELETE RESTRICT)ENGINE=InnoDB;

将外键添加到表中

MySQL添加外键语法

要将外键添加到现有表,请使用带有上述外键定义语法的ALTER TABLE语句:

ALTER TABLE table_nameADD CONSTRAINT constraint_nameFOREIGN KEY foreign_key_name(columns)REFERENCES parent_table(columns)ON DELETE actionON UPDATE action;

MySQL添加外键示例

现在,让我们添加一个名为vendors的新表,并更改products表以包含供应商ID字段:

USE dbdemo; CREATE TABLE vendors(    vdr_id int not null auto_increment primary key,    vdr_name varchar(255))ENGINE=InnoDB; ALTER TABLE products ADD COLUMN vdr_id int not null AFTER cat_id;

要向表中添加外键products,请使用以下语句:

ALTER TABLE productsADD FOREIGN KEY fk_vendor(vdr_id)REFERENCES vendors(vdr_id)ON DELETE NO ACTIONON UPDATE CASCADE;

mysql支持外键吗

现在,products表有两个外键,一个引用categories表,另一个引用vendors表。

本文有关“mysql支持外键吗”的介绍就到这里,如果大家认为该内容能够为实际工作带来帮助的话,请关注Worktile网站的相关频道,我们每日都会带来新的知识和内容,以供大家参考与学习!

文章标题:mysql支持外键吗,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/15058

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
亿速云的头像亿速云认证作者
上一篇 2022年6月29日 上午2:14
下一篇 2022年6月29日 上午3:02

相关推荐

  • translucenttb开机怎么启动

    translucenttb开机启动的方法: 1、首先我们同时按下键盘上的“Win+R”组合键,调出运行。 2、然后在运行框中输入“msconfig”再点击下方确定。 3、打开程序之后,进入“启动”选项卡,点击“打开任务管理器” 4、在任务管理器中,点击“启动”选项。 5、在任务管理器中,找到“Tra…

    2022年9月24日
    2.6K00
  • php进程通信之信号量的用途是什么

    常见进程通信方式 一些理论基础 临界资源:每次仅允许一个进程访问的资源。 临界区:每个进程中访问临界资源的那段代码叫临界区 所谓临界区(也称为临界段)就是访问和操作共享数据的代码段。 进程互斥:两个或以上的进程不能同时进入关于同一组共享变量的临界区域,即一个进程正在访问临界资源,另一个进程要想访问必…

    2022年9月2日
    54600
  • SolarWinds供应链APT攻击事件安全风险的示例分析

    背景 12月13日,美国拔尖安全公司FireEye(中文名:火眼)发布报告称,其发现一起全球性入侵活动,命名该组织为UNC2452。该APT组织通过入侵SolarWinds公司,在SolarWinds Orion商业软件更新包中植入恶意代码,进行分发,FireEye称之为SUNBURST恶意软件。该…

    2022年9月8日
    59600
  • windows office365头像不同步怎么解决

    office365头像不同步: 答:office365头像不同步可能是组件方面的问题建议先更新一下office组件解决。 也可能是网络的问题导致没有那么快的进行同步,可以换一个快一点的网络试试。 还有就是微软方面的问题了,没有立刻反馈并同步,只样就只可以去等待一下了。 office365头像更改教程…

    2022年9月21日
    1.3K00
  • mysql如何实现分组求和

    在mysql中,可以利用“GROUP BY”关键字和SUM()函数来实现分组求和,语法为“SELECT SUM(进行求和的字段名) FROM 表名 GROUP BY 需要进行分组的字段名;”。“GROUP BY”关键字可以根据一个或多个字段对查询结果进行分组,而SUM()函数根据分组情况分别返回不同…

    2022年9月21日
    2.2K00
  • CDR最新版本的图框精确剪裁位置在哪

    CDR最新版本的图框精确剪裁: 答:在“对象”工具栏下。 1、CDR最新版本将图框精确剪裁改名为“PowerClip”了,所以找不到。 2、我们只需要点击上方“对象”按钮,将鼠标移动到“PowerClip”就可以使用图框精确剪裁了。 3、这是上一代版本的图框精确剪裁,同样在“对象”下,不过是中文所以…

    2022年9月24日
    86500
  • Qt如何实现数据查询导出打印

    效果图 相关代码 void DataHelper::dataout(const QString &fileName, const QString &sheetName, const QString &title, const QList<QString> &amp…

    2022年9月6日
    71000
  • Buhtrap黑客组织最新0day漏洞实例分析

    一直以来Buhtrap组织以其针对俄罗斯的金融机构和企业而闻名。在我们的跟踪过程中,发现并分析了该组织的主要后门以及其他工具。 自2015年底以来,该组织变为以经济利益位目的的网络犯罪组织,其恶意软件出现于东欧和中亚进行间谍活动中。 2019年6月我们名列前茅次发现Buhtrap使用0day攻击作。…

    2022年9月15日
    69900
  • windows edge浏览器高级设置位置在哪

    edge浏览器高级设置找不到: 注:由于edge浏览器更新了新版本,所以高级设置也相应的改变了位置。 1、打开浏览器点击右上角三个点。 2、在下拉任务栏中点击“设置”。 3、在新窗口的左侧点击“高级”即可进入高级设置。 4、在右侧“高级”中进行高级设置。 到此,相信大家对“windows edge浏…

    2022年9月8日
    1.7K00
  • ECharts如何在pycharm中运行

    ECharts在pycharm中运行的方法 1、首先我们进入官网,把压缩包下载下来。 2、echarts 库放在解压后文件夹中的 dist 目录里, 将整个 dist 目录复制到你的项目中去,可重命名为 echarts 3、然后就可以绘制柱状图了。 关于“ECharts如何在pycharm中运行”的…

    2022年9月26日
    66000
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部