MySQL外键约束(FOREIGN KEY)

article/2025/9/29 9:06:16

MySQL外键约束(FOREIGN KEY)

MySQL 外键约束(FOREIGN KEY)用来在两个表的数据之间建立链接,它可以是一列或者多列。一个表可以有一个或多个外键。

外键对应的是参照完整性,一个表的外键可以为空值,若不为空值,则每一个外键的值必须等于另一个表中主键的某个值。

外键是表的一个字段,不是本表的主键,但对应另一个表的主键。定义外键后,不允许删除另一个表中具有关联关系的行。

外键的主要作用是保持数据的一致性、完整性。例如,部门表 tb_dept 的主键是 id,在员工表 tb_emp5 中有一个键 deptId 与这个 id 关联。

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

选取设置 MySQL 外键约束的字段

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

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

在创建表时设置外键约束

在数据表中创建外键使用 FOREIGN KEY 关键字,具体的语法规则如下:

[CONSTRAINT <外键名>] FOREIGN KEY 字段名 [,字段名2,…]
REFERENCES <主表名> 主键列1 [,主键列2,…]

其中:外键名为定义的外键约束的名称,一个表中不能有相同名称的外键;字段名表示子表需要添加外健约束的字段列;主表名即被子表外键所依赖的表的名称;主键列表示主表中定义的主键列或者列组合。
【实例 1】为了展现表与表之间的外键关系,本例在 test_db 数据库中创建一个部门表 tb_dept1,表结构如下表所示。
在这里插入图片描述
创建 tb_dept1 的 SQL 语句运行结果如下所示

mysql> CREATE TABLE tb_dept1-> (-> id INT(11) PRIMARY KEY,-> name VARCHAR(22) NOT NULL,-> location VARCHAR(50)-> );
Query OK, 0 rows affected (0.37 sec)

创建数据表 tb_emp6,并在表 tb_emp6 上创建外键约束,让它的键 deptId 作为外键关联到表 tb_dept1 的主键 id,输入的 SQL 语句和运行结果如下所示。

mysql> CREATE TABLE tb_emp6-> (-> id INT(11) PRIMARY KEY,-> name VARCHAR(25),-> deptId INT(11),-> salary FLOAT,-> CONSTRAINT fk_emp_dept1-> FOREIGN KEY(deptId) REFERENCES tb_dept1(id)-> );
Query OK, 0 rows affected (0.37 sec)
mysql> DESC tb_emp6;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int(11)     | NO   | PRI | NULL    |       |
| name   | varchar(25) | YES  |     | NULL    |       |
| deptId | int(11)     | YES  | MUL | NULL    |       |
| salary | float        | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
4 rows in set (1.33 sec)

以上语句执行成功之后,在表 tb_emp6 上添加了名称为 fk_emp_dept1 的外键约束,外键名称为 deptId,其依赖于表 tb_dept1 的主键 id。

提示:关联指的是关系数据库中,相关表之间的联系。它是通过相同的属性或属性组来表示的。子表的外键必须关联父表的主键,且关联字段的数据类型必须匹配,如果类型不一样,则创建子表时会出现错误“ERROR 1005(HY000):Can’t create table’database.tablename’(errno:150)”。

在修改表时添加外键约束

在修改数据表时添加外键约束的语法规则为:

ALTER TABLE <数据表名> ADD CONSTRAINT <索引名>
FOREIGN KEY(<列名>) REFERENCES <主表名> (<列名>);

【实例 2】修改数据表 tb_emp2,将字段 deptId 设置为外键,与数据表 tb_dept1 的主键 id 进行关联,输入的 SQL 语句和运行结果如下所示。

mysql> ALTER TABLE tb_emp2-> ADD CONSTRAINT fk_tb_dept1-> FOREIGN KEY(deptId)-> REFERENCES tb_dept1(id);
Query OK, 0 rows affected (1.38 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> SHOW CREATE TABLE tb_emp2\G
*************************** 1. row ***************************Table: tb_emp2
Create Table: CREATE TABLE `tb_emp2` (`id` int(11) NOT NULL,`name` varchar(30) DEFAULT NULL,`deptId` int(11) DEFAULT NULL,`salary` float DEFAULT NULL,PRIMARY KEY (`id`),KEY `fk_tb_dept1` (`deptId`),CONSTRAINT `fk_tb_dept1` FOREIGN KEY (`deptId`) REFERENCES `tb_dept1` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312
1 row in set (0.12 sec)

删除外键约束

对于数据库中定义的外键,如果不再需要,可以将其删除。外键一旦删除,就会解除主表和从表间的关联关系,MySQL 中删除外键的语法格式如下:

ALTER TABLE <表名> DROP FOREIGN KEY <外键约束名>;

实例 3】删除数据表 tb_emp2 中的外键约束 fk_tb_dept1,输入的 SQL 语句和运行结果如下所示。

mysql> ALTER TABLE tb_emp2-> DROP FOREIGN KEY fk_tb_dept1;
Query OK, 0 rows affected (0.19 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> SHOW CREATE TABLE tb_emp2\G
*************************** 1. row ***************************Table: tb_emp2
Create Table: CREATE TABLE `tb_emp2` (`id` int(11) NOT NULL,`name` varchar(30) DEFAULT NULL,`deptId` int(11) DEFAULT NULL,`salary` float DEFAULT NULL,PRIMARY KEY (`id`),KEY `fk_tb_dept1` (`deptId`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312
1 row in set (0.00 sec)

可以看到,tb_emp2 中已经不存在 FOREIGN KEY,原有的名称为 fk_emp_dept 的外键约束删除成功。

ok


http://chatgpt.dhexx.cn/article/Q7QH0yEn.shtml

相关文章

外键及其约束理解

一&#xff1a;首先是外键的定义 如果一个字段X在一张表&#xff08;表一&#xff09;中是主关键字&#xff0c;而在另外一张表&#xff08;表二&#xff09;中不是主关键字&#xff0c;则字段X称为表二的外键&#xff1b;换句话说如果关系模式R1中的某属性集不是自己的主键&am…

Oracle 如何设置外键约束

表中的外键就是对于该属性所对应的域的限制&#xff0c;对于插入到表中的该属性的数据进行约束。并且该外键映射于所对应的另一张表的能唯一标识每一条数据的主键&#xff0c;根据参照完整性规则&#xff0c;外键可以取空值或者取对应主键的数值。外键的作用可以认为使两张表产…

外键约束详解及术语释疑

外键约束详解及术语释疑 先要理清几个概念&#xff1a; 1&#xff09;候选键&#xff08;Candidate Key&#xff09;&#xff1a;关系中的一个属性组&#xff0c;其值能唯一标识一个元组&#xff0c;若从该属性组中去掉任何一个属性&#xff0c;它就不具有这一性质了&#xf…

mysql 添加外键约束

创建表时添加约束 create table table_name( id int primary key auto_increment, #设为主键且自动增长 name not null unique, #不为空且值唯一 sex default 男, #使用默认约束&#xff0c;默认性别为男 constraint 索引名 foreign key(外键列) references 主键表(主键列…

SQL 外键约束

-- 概念 外键用来让2张表的数据之间建立连接&#xff0c;从而保证数据的一致性和完整性。 添加外键 第一种&#xff1a;在建表时直接添加 CREATE TABLE 表名(字段名 数据类型.....[CONSTRAINT] [外键名称] FOREIGN KEY (外键字段名) REFERENCES 主表(主表列名)); 第二…

外键约束三种形式

外键有三种约束模式&#xff1a; district : 严格模式(默认的)&#xff0c;父表不能删除或更新一个已经被子表数据引用的记录。cascade : 级联模式&#xff0c;父表的操作&#xff0c;对应子表关联的数据也跟着操作。 set null &#xff1a; 置空模式&#xff0c;父表被操作之…

mysql外键约束

1、什么是外键 -- 约束 2、外键的作用 用于表与表之间的关联 3、外键的创建 3、1 mysql 创建带有外键的表 CREATE TABLE student (id int(4) NOT NULL AUTO_INCREMENT COMMENT 学号,name varchar(10) NOT NULL DEFAULT "匿名" COMMENT 姓名,password varchar(11) N…

数据库是否应该使用外键约束?

一、前言 对于【是否使用外键约束】这个话题已经是老生常谈的了。在学校中&#xff0c;老师交给我们的大多是需要我们建立外键约束&#xff0c;但进入了实际工作很多时候并不会使用外键&#xff0c;而是通过代码逻辑来控制。包括在阿里的JAVA规范中也明确规定&#xff1a;【强…

mysql 创建外键约束

前言 如果一张表中有一个非主键的字段指向了另一张表中的主键&#xff0c;就将该字段叫做 外键。 一张表中外键可以有多个&#xff0c;也就是不同字段指向了不同表中的主键。 方式1-在创建表时设置外键约束 [constraint <外键名>] foreign key 字段名 [&#xff0c;字段…

外键及外键约束理解

转自&#xff1a;https://www.cnblogs.com/chenxiaohei/p/6909318.html 数据库&#xff08;外键及其约束理解&#xff09; 一&#xff1a;首先是外键的定义 如果一个字段X在一张表&#xff08;表一&#xff09;中是主关键字&#xff0c;而在另外一张表&#xff08;表二&#…

MySQL的约束——外键约束

约束&#xff1a; MySQL的约束的概述&#xff1a; 概念&#xff1a; 约束是作用于表中字段上的规则&#xff0c;用于限制存储在表中的数据 目的&#xff1a; 保证数据库中数据的正确&#xff0c;有效和完整性 分类 1.非空约束 NOT NULL 限制该字段的数据不能为null2.唯一…

4、外键约束(FOREIGN KEY)

MySQL 外键约束&#xff08;FOREIGN KEY&#xff09;是表的一个特殊字段&#xff0c;经常与主键约束一起使用。对于两个具有关联关系的表而言&#xff0c;相关联字段中主键所在的表就是主表&#xff08;父表&#xff09;&#xff0c;外键所在的表就是从表&#xff08;子表&…

【表的完整性约束外键约束】

外键约束 今天跟大家聊聊这个外键约束&#xff0c;简单来说呢&#xff0c;就是&#xff0c;嗯&#xff0c;&#xff0c;关于两个表的操作。对&#xff0c;就是这样的&#xff0c;来跟我一起看看叭。 【1】什么是外键约束&#xff1f; 外键约束&#xff08;FOREIGN KEY&#xf…

MySQL外键约束详解

今天继续给大家介绍MySQL相关知识&#xff0c;本文主要内容是MySQL外键约束详解。 一、MySQL外键约束作用 外键约束&#xff08;Foreign Key&#xff09;即数据库中两个数据表之间的某个列建立的一种联系。这种联系通常是以实际场景中含义完全相同的字段所造成的。MySQL通过外…

【MySQL】外键约束

文章目录 &#xff08;一&#xff09;外键约束&#xff08;二&#xff09;外键约束的功能&#xff08;三&#xff09;学生表和班级表&#xff08;1&#xff09;练习&#xff08;2&#xff09;两个问题&#xff08;3&#xff09;解决方案&#xff08;4&#xff09;结果展示 &…

JavaWeb JSP内置对象之session对象

4、session对象 在WEB应用中&#xff0c;当一个客户首次访问服务器上的某个jsp页面时&#xff0c;jsp引擎&#xff08;比如TOMCAT&#xff09;将为这个客户创建一个session对象&#xff0c;当客户关闭浏览器离开之后&#xff0c;session对象被注销。 设置session的目的是为了服…

jsp内置对象之session对象

在WEB应用中&#xff0c;当一个客户首次访问服务器上的某个jsp页面时&#xff0c;jsp引擎&#xff08;比如TOMCAT&#xff09;将为这个客户创建一个session对象&#xff0c;当客户关闭浏览器离开之后&#xff0c;session对象被注销。 设置session的目的是为了服务器端识别客户。…

JAVA Web入门之JSP内置对象的解析及使用(超详细必看)

创作不易 觉得有帮助请点赞关注收藏~~ 概述&#xff1a;由于JSP使用java作为脚本语言 所以JSP具有强大的对象处理能力 并且可以动态创建web页面内容 但java语言在使用一个对象前 需要先实例化这个对象 为了简化开发 JSP提供了一些内置对象 用来实现JSP应用 在使用JSP内置对象…

JSP内置对象和四大作用域

一、JSP九大内置对象 名称 类型 含义 获取方式 request HttpSevletRequest 封装所有请求信息 方法参数 response HttpServletResponse 封装所有响应信息 方法参数 session HttpSession 封装所有会话信息 req.getSession() application ServletContext 所有信…

jsp内置对象的作用范围

内置对象的作用范围是指每个内置对象的某个实例在多长时间和多大的范围中有效&#xff0c;即在什么样的范围内可以有效地访问同一个对象实例。 在javax.servlet.jsp.PageContext的类中定义了4个常量来指定内置对象的作用范围&#xff1a;APPLICATION_SCOPE、SESSION_SCOPE、PAG…