mysql - 外键约束(foreign key)FK

本文详细介绍了MySQL中的各种约束类型,包括非空约束、唯一性约束、主键约束、外键约束等,并通过实例演示了如何使用这些约束来确保数据的一致性和准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考:

MySQL——约束(constraint)详解

constraint 约束概念

约束英文:
constraint
英[kənˈstreɪnt] 美[kənˈstrent] n. 约束; 限制; 强制;

约束实际上就是表中数据的限制条件

约束种类

非空约束(not null):用not null约束的字段不能为null值,必须给定具体的数据
唯一性约束(unique): unique约束的字段,具有唯一性,不可重复,但可以为null
主键约束(primary key) PK
外键约束(foreign key) FK
检查约束(目前MySQL不支持、Oracle支持)

主键约束与“not null unique”区别

给某个字段添加主键约束之后,该字段不能重复也不能为空,效果和”not null unique”约束相同,但是本质不同。
主键约束除了可以做到”not null unique”之外,还会默认添加”索引——index”

外键约束(foreign key)FK

外键约束(foreign key)FK,只能是表级定义,外键其实就是引用.

foreign key(classno) references t_class(cno)

什么是外键

若有两个表A、B,

id是A的主键,而B中也有id字段,则id就是表B的外键,外键约束主要用来维护两个表之间数据的一致性。

A为基本表(比如:班级表),B为信息表(比如:学生表)

示例:

建表:

//表A带主键
create table t_class (
  cno   int(10) primary key,
  cname varchar(128) not null unique
);

//表B带外键(关联A表进行约束)
create table t_student (
  sno     int(10) primary key auto_increment,
  sname   varchar(32) not null,
  classno int(3),
  foreign key (classno) references t_class (cno)
);

插入数据:

insert into t_class (cno, cname)
values (100, 'aaaaaaxxxxxx');
insert into t_class (cno, cname)
values (200, 'oooooopppppp');

insert into t_student (sname, classno)
values ('jack', 100);
insert into t_student (sname, classno)
values ('lucy', 100);
insert into t_student (sname, classno)
values ('king', 200);

查询:

select *
from t_class;

在这里插入图片描述

select *
from t_student;

在这里插入图片描述

select s.*, c.*
from t_student s
       join t_class c on s.classno = c.cno;

在这里插入图片描述

### 如何在 MySQL 中创建或添加约束约束中,子表中的某一列通过引用父表的一列来建立关联关系。这种机制可以确保两个表之间的参照完整性。 #### 约束的基本语法 用于向现有表中添加约束的 SQL 语句遵循以下通用格式[^4]: ```sql ALTER TABLE <数据表名> ADD CONSTRAINT <名> FOREIGN KEY (<列名>) REFERENCES <主表名> (<列名>); ``` #### 实际案例分析 以下是几个具体的例子: 1. **为 `student` 表添加约束** 假设有一个名为 `student` 的表和另一个名为 `grade` 的表,其中 `student.gid` 列需要引用 `grade.id` 列,则可以通过以下语句实现: ```sql ALTER TABLE student ADD CONSTRAINT FK_ID FOREIGN KEY (gid) REFERENCES grade (id); ``` 这条语句的作用是定义了一个名称为 `FK_ID` 的约束,它使得 `student.gid` 只能存储那些存在于 `grade.id` 中的有效值[^1]。 2. **为 `emp` 表添加约束** 如果存在一张员工表 (`emp`) 和部门表 (`dept`),并且希望将 `emp.dept_id` 设置为对部表 `dept.id` 的引用,则可使用如下语句: ```sql ALTER TABLE emp ADD CONSTRAINT fk_emp_dept_id FOREIGN KEY (dept_id) REFERENCES dept (id); ``` 此处定义了一种逻辑上的依赖关系,即只有当某个部门编号确实存在于 `dept` 表时,才能将其分配给某位员工记录[^2]。 3. **更复杂的命名约定** 当前数据库设计通常推荐采用更具描述性的名字作为标识符的一部分。例如,在下面的例子中,“`dept_id_fk`”清楚表明这是一个针对 `dept_id` 字段所施加的限制条件: ```sql ALTER TABLE emp ADD CONSTRAINT dept_id_fk FOREIGN KEY (dept_id) REFERENCES dept (deptno); ``` #### 需要注意的地方 - 父表与子表之间必须具有相同的或者兼容的数据类型。 - 子表上被指定参与构成的那个属性不允许为空除非另声明允许NULL值的情况发生。 - 若要成功实施上述任何一种变更操作之前,请确认目标架构支持事务处理功能以及启用必要的引擎(InnoDB),因为MyISAM等其他类型的存储不提供完整的ACID特性保障[^3]。 ```sql -- 示例代码:验证当前使用的存储引擎是否适合应用 SHOW CREATE TABLE your_table_name; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值