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

相关推荐

  • pr视频怎么导出为手机视频大小

    pr视频导出为手机视频大小的方法: 1、首先,我们点击左上角“文件”并新建一个“项目” 2、新建后,右键空白处,选择“新建”一个“序列” 3、然后进入“设置”,根据图示参数进行设置,最重要的是设置“垂直比9:16” (手机常用的大小有360×640、750×1334、720&#2…

    2022年8月31日
    26600
  • windows 0x00000bcb如何解决

    解决方法: 方法一: 1、首先我们通过左下角的开始菜单进入“设置” 2、然后在设置面板中打开“更新和安全” 3、然后在其中选择“检查更新”,更新一下最新的系统补丁,应该就可以连接到打印机了。 方法二: 1、要是更新系统后还用不了,就可以搜索并打开“设备管理器” 2、然后在其中展开打印队列,选择要使用…

    2022年9月15日
    35600
  • coreldraw如何抠图

    coreldraw抠图的方法 1、打开软件,点击上方导入,选择图片。 2、右键单击图片,选择锁定对象。 3、点击左边的手绘工具。 4、选择钢笔工具,勾出轮廓。 5、这个时候线条还不是很流畅,所以我们点击左边形状来调整一下。 6、然后右键单击图片,解除锁定。 7、右键单击,选择编辑内容,作调整,这时抠…

    2022年9月26日
    15500
  • TypeScript中怎么定义变量及使用数据类型

    TypeScript定义变量 变量声明格式 我在前面强调过,在TypeScript中定义变量需要指定 标识符 的类型。 所以完整的声明格式如下: 声明了类型后TypeScript就会进行类型检测,声明的类型可以称之为类型注解; var/let/const 标识符: 数据类型 = 赋值; 比如我们声明…

    2022年8月31日
    53800
  • mysql怎么设置最大连接数

    方法一:命令行修改 我们只需要打开mysql的控制台,输入“set GLOBAL max_connections=1000;”语句,就可直接设置最大连接数,如下图所示: 注:这种方法标不治本,只能暂时的修改最大连接数,一点重启mysql,最大连接数又会变回原先设置的值。 方法二:通过mysql配置文…

    2022年9月15日
    15900
  • windows 0xc000021a怎么手动修复

    0xc000021a手动修复方法: 方法一: 1、首先按下电脑的电源键,会重新启动电脑。 2、重复操作2-3次,会进入系统修复界面,选择“高级选项” 3、接着进入“疑难解答”,再选择进入其中的“高级选项” 4、然后在其中选择进入“命令提示符” 5、然后在命令提示符中依次分别输入“bootrec /f…

    2022年9月15日
    51000
  • windows的任务管理器如何打开

    打开任务管理器的多种方式 方法一:使用Ctrl+Shift+Esc组合键调出任务管理器。 方法二:用鼠标右键点击任务栏选择“任务管理器”, 方法三:使用组合键“Win+R”键打开运行对话框,输入taskmgr,回车,即打开 方法四:按顺序连续按住Ctrl、Alt和Delete键 方法五:直接找到Ta…

    2022年9月6日
    13000
  • 如何使用css实现​文本渐变

    文本渐变 文本渐变效果很流行,使用 CSS3 能够很简单就实现: h3[data-text] { position: relative;}h3[data-text]::after { content: attr(data-text); z-index: 10; color: #e3e3e3; pos…

    2022年9月1日
    12300
  • SQL字符串的合并与拆分实例代码分析

    字符串的合并 在Oracle中可能有多种实现方法,目前我已知的有两种,下面记录下这两种的实现: 字符串合并方法一: 实现SQL: –方法一SELECT d.dept_name,wm_concat(e.emp_name) FROM employee eINNER JOIN department d …

    2022年9月1日
    22800
  • 如何使用Masscan、Nmap、ELK做内网资产收集

    安装 安装masscan # yum install git gcc make libpcap-devel# git clone https://github.com/robertdavidgraham/masscan# cd masscan# make# cp bin/masscan /bin 安…

    2022年9月8日
    34500
联系我们
站长微信
站长微信
电话联系

400-800-1024

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

分享本页
返回顶部