mysql中表的约束

发布于:2025-08-30 ⋅ 阅读:(23) ⋅ 点赞:(0)

什么是表的约束?

表的约束是一堆特殊的关键字,这些关键字用来给mysql语句加上一些条件限制,其实前面我们说数据类型就可以提供很多约束,但是数据类型约束很单一,需要有一些额外的约束,让数据更加有秩序,从而更好的保证数据的合法性

我们如何看待数据库表的约束?

数据库表 不要怕约束多,它是来帮助我们的!
约束越多,上层编码会变得越轻松

那我们一般是通过变量的类型和表的约束关键字实现对表的约束。变量的类型前面我们已经学过了。那表的约束关键字是什么?有哪些?下面我们就来一一介绍

非空约束NOT NULL

什么是非空约束?非空约束干什么的?

NOT NULL 用于约束表中的某列,要求每一个表项中该列必须有值,不允许存储空值。
在创建表时,可以使用 NOT NULL 约束来确保该列必须有值,从而保证数据的完整性和有效性。

非空约束的好处是什么?

非空约束可以确保某一个变量必须有值,如果你插入一个表项时,该列没有填值,后台就会报错。无法创建成功。从而使得上层业务实现无需再进行变量是否为空的判断,简化了业务逻辑

非空约束如何使用?

例如,以下是一个创建表时使用 NOT NULL 约束的示例,在代码中,name 列被定义为 NOT NULL,这意味着什么?

CREATE TABLE students (
  id INT PRIMARY KEY,
  name VARCHAR(50) NOT NULL,
  age INT
);

在上述代码中,name 列被定义为 NOT NULL,这意味着在向 students 表中插入数据时,name 列的值不能为空。如果尝试插入一条 name 列为空的记录,数据库将抛出错误。

默认约束default

默认约束default的功能是?

默认约束default的功能就相当于为表中变量的赋值提供缺省值
如果某一种数据会经常性的出现某个具体的值,那我们就可以在一开始就用default指定好,在需要真实数据的时候,用户可以选择性的使用默认值

如何使用默认约束default?

定义一张表时,在变量的类型后面添加default + 默认缺省值。下面我举个例子
在这里插入图片描述

非空约束NOT NULL与默认约束default可以同时用吗?如果可以,怎么同时用?同时用会产生什么样的效果?

可以,但是不建议把这俩放一起
使用方法举例:mysql> create table if not exists t13 ( age int not null default 18 );

如果对一个变量同时使用非空约束NOT NULL与默认约束default,由于default的优先级更高,所以会覆盖掉not null的效果,相当于not null 白写了,只剩一个default的效果,参数可以缺省不传

列描述comment

列描述comment效果是什么?

效果类似于c语言中的注释,主要作用是写给程序员,帮助程序员理解代码/变量/指令的

如何使用列描述comment这个关键字?

在一行指令的最后,加上关键字comment在一行指令的最后,加上关键字comment再加单引号,里面写你要补充的内容,使用示例如下

CREATE TABLE employees (
  id INT PRIMARY KEY AUTO_INCREMENT COMMENT '员工唯一标识ID',
  name VARCHAR(100) NOT NULL COMMENT '员工姓名',
  gender ENUM('男', '女', '未知') DEFAULT '未知' COMMENT '员工性别',
  hire_date DATE COMMENT '入职日期',
  salary DECIMAL(10, 2) UNSIGNED COMMENT '月薪(单位:元,保留两位小数)'
);

零填充zerofill

zerofill有啥用?

  1. 数据格式化:
    用于指定某列数据以零填充的方式存储和显示。例如,在MySQL中,如果将一个整数列定义为 INT(5) ZEROFILL ,那么当存储的值小于5位时,会在数字前面用零填充,以达到5位的固定长度。如存储数字5,实际显示为 00005 。
  2. 数据类型转换与约束:
    ZEROFILL 会自动将列的数据类型转换为无符号类型,这意味着该列只能存储非负整数。这样可以确保数据的完整性和准确性,防止意外插入负数。

注意: zerofill 表示当数值的位数小于显示宽度时,用前导零补全(例如,若存储 5,会显示 05)。 但当数值的位数超过超过显示宽度时,zerofill 不生效,会完整显示实际数值。

int(10)后面这个10是啥意思呢?

在 INT(10) 中,数字 10 规定了MySQL在显示这个int整数时的显示宽度。例如如果一个变量的类型是 INT(10) ,当存储的数字是 5 时,如果设置了 ZEROFILL ,则会显示为 0000000005 ;如果没有 ZEROFILL ,即使这个变量的类型 INT(10) ,打印出来依然是正常显示 5

假如说一个变量的类型是int(2) zerofill,但是这个变量赋值为10000,请问我将这个变量打印出来,显示的是什么?

打印结果会显示 10000(而非仅显示 2 位数字)。因为int(2) 中的 2显示宽度,仅指定数值在显示时的最小位数,不限制字段能存储的实际数值范围(int 类型本身可存储 -21474836482147483647 的整数)。

如果一个变量的类型是int(10),但是我想插进去一个11位的数据,请问可以插吗?
可以插,结果就是会显示11位数据,如果该变量数据位数不到10位,才会在高位补0

用zerofill给数据填充的0,会在计算机内部存储这个数据时也加进去吗?

不会,计算机内部该怎么存还怎么存,不受影响。
zerofill的作用仅仅是方便可视化

主键primary key

什么是主键?

主键是数据的一个属性,数据库中的表用主键来唯一标识一个对象/一条记录,用户可以通过主键在一张表中快速检索出对应的记录

如何把一列属性设置为主键呢?

在创建一张表的过程中,我们需要定义变量,依次给出这个变量的名字,然后它的类型,此时我们只需要在给出某个变量的类型之后,紧接着输入关键字Primary key,就可以成功的将这个变量设置为主键,比如在下面的例子中,我们创建了一张用户表,并将属性id设置为了主键

CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户唯一ID',
  username VARCHAR(50) NOT NULL COMMENT '用户名',
  email VARCHAR(100) UNIQUE COMMENT '邮箱'
);

一张表中有多个属性,我们应该选谁作为主键呢?(主键的选择)

在这之前我们先考虑另外一个问题,为什么你学校不用身份证号作为你在学校里面的标识呢?
因为身份证号不是学校管的,是国家管的,如果国家突然改了公民的身份证号,那学校管理系统中用公民身份证号作为标识的业务就都瘫痪了
说白了,本质原因就是,学校想让学生的标识号一旦确定就不能被更改,但是学校无法保证身份证号会不会突然被改了。为了避免上面那种瘫痪的情况,学校就自己创建了一套学号作为学校里面同学的标识。他自己创建的,他当然能够保证这套标识体系不会在自己没有准备的情况下更改。

然后再回到我们最初的话题,首先主键必须要作为一个表项在这张表中的标识,他必须有唯一性,其次他不能在管理者不知情的情况下被更改

在实际业务中,我们通常会选下面的属性作为主键:

  1. 与业务无关的id
    与业务相关就意味着这个ID是不稳定的,容易被修改。我们要想让他不容易被修改,那就必须让他和业务不相关,而用户的ID往往是最佳的选择
  2. 从众多具有唯一性的属性中选择一个,作为主键
    比如:学号

主键对数据的约束是什么呢?

主键在表中具有唯一性,并且不能为空

如果我这个时候在表中插入一个数据,它的主键值和表中已有的数据主键值冲突,此时会发生什么事呢?

那么MySQL会报错,这个插入操作将被终止

如何利用主键在表中进行快速检索?

命令行输入
select * form + 表名 + where + 主键变量名 = 具体的主键值

如何剥夺一个属性的主键身份?

删除主键的时候不需要指定主键的属性名
使用ALTER TABLE + 表名 + DROP PRIMARY KEY语句直接删除主键约束, table_name 为包含要剥夺主键身份属性的表名。

什么是复合主键?

复合主键是指在数据库表中,由两个或两个以上的字段组合而成的主键。

如何设置复合主键?

alter table + 表名+add primary key(类型1,类型2)

复合主键冲突:是复合主键中任意一个属性冲突就算主键冲突,还是所有属性都相同 才算主键冲突?

所有属性都相同 才算主键冲突

我创建表的时候设置了一个初始的主键,但是我在使用的过程中想要更改我这个表的主键,我应该怎么做?

  1. 首先要备份数据:在进行任何修改操作之前,务必先备份表中的数据,以防意外情况发生。可以使用mysqldump命令进行备份,例如:mysqldump -u username -p database_name > backup.sql
  2. 删除原主键:使用ALTER TABLE语句删除原有的主键约束。例如,若要删除名为students的表中的主键,可以执行以下语句:
ALTER TABLE students DROP PRIMARY KEY;
  1. 确保新主键字段的唯一性和非空性:如果新的主键字段还没有满足唯一性和非空的条件,需要先通过ALTER TABLE语句的MODIFY COLUMN子句来修改字段的属性。例如,将new_primary_key_column字段设置为非空且唯一
ALTER TABLE your_table MODIFY COLUMN new_primary_key_column DATATYPE NOT NULL UNIQUE;
  1. 添加新主键:删除原主键后,使用ALTER TABLE语句添加新的主键约束。例如,要将new_primary_key_column字段设置为新的主键
ALTER TABLE your_table ADD PRIMARY KEY (new_primary_key_column);

注意:我们的主键一般都是在创建表时就确定下来,虽然后续创建完成之后,mysql语法也支持更改主键,但是我们极其不推荐,因为非常麻烦

自增长 auto_increment

自增长的作用是什么?

自增长是一种特殊的字段类型,用于生成唯一的、按照一定顺序增长的数字标识。

如何使用?

比如我们创建表时,在主键修饰词primary key后面,加上关键字auto_increment
加上之后,我们再向表中插入新数据时,就不用输入主键值了,主键值默认缺省的条件下,数据库程序会帮我们自动生成一个递增不重复的主键值付给刚刚插入的数据

虽然使用auto_increment可以自动帮我们生成一个递增的主键值,但我在插入一个新表项时偏要自己输入一个主键值,并且这个值和之前,相比还是不连续的,请问这样可以吗?如果可以,在这之后我再插入一个新数据,不特意指定主键值,请问系统帮我默认生成的主键值是多少呢

当然可以,在这之后默认生成的主键值会以当前最大的主键值为基准加一生成

唯一键unique

为什么有了主键之后,还要有唯一键?

原因就是我们每个人身上具有唯一性的属性数据有很多,比如除了你的身份证之外,你的手机号码,QQ邮箱,游戏账号,也都是具有唯一性的。
同样的,我们的不同被描述的对象,该对象内部,可能也会存在不止一个需要唯一性的属性。这时候我们就不用主键,而用唯一键来修饰这些属性

唯一键如何使用?

关键字unique放在变量的类型之后,比如下面创建users表的sql语句中我们将邮箱和手机号码设置唯一键

CREATE TABLE users (
  id INT PRIMARY KEY AUTO_INCREMENT,
  username VARCHAR(50) NOT NULL,
  email VARCHAR(100) NOT NULL UNIQUE COMMENT '邮箱必须唯一', -- 单字段唯一键
  phone VARCHAR(20) UNIQUE COMMENT '手机号可唯一,允许为NULL' -- 允许NULL的唯一键
);

在 MySQL 中,UNIQUE(唯一键)用于确保表中指定字段的值不重复(允许 NULL 值,但 NULL 也只能出现一次),常用于需要唯一性约束但又不需要作为主键的字段(如邮箱、手机号等)。

当我们需要多个字段的组合值唯一时,也可以定义联合唯一键,比如下面的例子中,我们通过联合唯一键的设置可以确保一名学生不能重复选同一门课。

CREATE TABLE student_courses (
  student_id INT NOT NULL,
  course_id INT NOT NULL,
  score INT,
  -- 联合唯一键:确保一名学生不能重复选同一门课
  UNIQUE KEY uk_student_course (student_id, course_id)
);

如果表已创建,我们也可通过 ALTER TABLE + ADD 语句添加唯一键:

-- 为 users 表的 phone 字段添加唯一键
ALTER TABLE users 
ADD UNIQUE KEY uk_phone (phone);

-- 为 student_courses 表添加联合唯一键
ALTER TABLE student_courses 
ADD UNIQUE KEY uk_stu_course (student_id, course_id);

当插入或更新数据导致唯一键重复时,会发生什么事情?

当插入或更新数据导致唯一键重复时,MySQL 会抛出错误。比如连续执行下面两条sql语句

INSERT INTO users (username, email) VALUES ('user1', 'a@example.com');
INSERT INTO users (username, email) VALUES ('user2', 'a@example.com'); -- 

mysql会报错:Duplicate entry 'a@example.com' for key 'email',第二句sql指令就没有办法成功执行了。

如何删除唯一键?

可通过DROP INDEX + 唯一键名删除:

-- 查看表的索引(含唯一键),获取键名
SHOW INDEX FROM users;

-- 删除指定唯一键
ALTER TABLE users 
DROP INDEX uk_email; -- uk_email 是唯一键的名称

唯一键和主键的区别是什么?

  1. 唯一键允许出现空值,主键不允许
    主键的唯一性约束最为严格,表中的每一行数据的主键值必须唯一,且不允许出现空值;唯一键虽然也保证对应列的值不能重复,但可以存在一个空值。
    例如,在 “员工” 表中,若 “员工编号” 设为主键,其值不能重复且不能为空;而 “电子邮件地址” 设为唯一键,每个员工的邮箱应唯一,同时可以有一个员工未提供邮箱(即空值) 。
  2. 一个表只能有一个主键,但可以设置多个唯一键
    例如,在 “订单” 表中,“订单编号” 可作为主键,同时 “客户编号” 和 “订单日期” 的组合可设为唯一键,以确保每个客户在同一天不会有重复订单。
  3. 主键默认是聚簇索引,唯一键是非聚簇索引

外键foreign key

什么是外键?

外键是一个表中的一列或多列,其值必须与另一个表(通常称为主表)中的主键或唯一键的值相匹配,或者为空值。

外键的作用是什么?

外键的主要作用就是建立表间关系,即外键是在关系型数据库中建立表与表之间关联的重要手段。比如在数据库中,有一个 “订单表” 和一个 “客户表”,我们可以通过在 “订单表” 中设置 “客户 ID” 作为外键,关联到 “客户表” 的 “客户 ID” 主键,从而清晰地表达出订单是由哪个客户创建的这种关系。

具体的实现实例如下:

-- 1. 先创建客户表(主表)
CREATE TABLE customer (
  customer_id INT PRIMARY KEY AUTO AUTO_INCREMENT COMMENT '客户唯一ID(主键)',
  customer_name VARCHAR(100) NOT NULL COMMENT '客户姓名',
  phone VARCHAR(20) UNIQUE COMMENT '客户电话'
);

-- 2. 创建订单表(从表),并设置外键关联客户表
CREATE TABLE `order` (
  order_id INT PRIMARY PRIMARY KEY AUTO_INCREMENT COMMENT '订单唯一ID(主键)',
  order_no VARCHAR(50) NOT NULL UNIQUE COMMENT '订单编号',
  customer_id INT NOT NULL COMMENT '关联的客户ID',
  order_date DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '下单时间',
  total_amount DECIMAL(10,2) UNSIGNED NOT NULL COMMENT '订单总金额',
  
  -- 设置外键:订单表的customer_id关联客户表的customer_id
  CONSTRAINT fk_order_customer -- 指定外键名称
  FOREIGN KEY (customer_id) -- 将TABLE `order`中的customer_id设置为外键
  REFERENCES customer(customer_id) -- 将TABLE `order`中的外键customer_id关联到 customer表中的customer_id
  ON DELETE RESTRICT  -- 限制删除:若客户有订单,则不允许删除该客户
  ON UPDATE CASCADE   -- 级联更新:若客户ID修改,订单表的对应ID也自动更新
);

什么是主表?什么是从表?主表和从表的关系是什么?

包含外键的表称为从表(或子表),被引用的表称为主表(或父表)。
主表和从表的大致关系,可以从字面上的主从来理解,主表离开从表,没有问题。但从表离开主表,就无法表达完整的意思了

主表和从表的具体关系:

  • 主表的一条记录可以被从表的多条记录引用(一个客户可以有多个订单)
  • 从表的外键值受主表主键值约束:
    比如不能向从表中插入主表中不存在的外键值
    主表中被从表引用的记录,删除或修改时会受外键约束限制(如ON DELETE RESTRICT禁止删除有订单的客户)。

是不是表中随便一个属性都能当做外键?

肯定不是,必须要满足下面的条件

  1. 从表中的外键数据类型必须与主表被引用字段完全一致(含长度、符号、字符集等)
  2. 主表被引用字段是主键或唯一键(确保关联的唯一性)

从表与主表的关联字段,名字能不能不一样?

可以不一样。外键约束的核心要求「从表关联字段的数据类型与主表被引用字段完全匹配」,以及 「主表被引用字段是主键/唯一键」字段名称是否相同并非强制要求。只要满足数据类型兼容和业务逻辑合理,从表的关联字段可以起不同的名字。
举个例子,假设存在以下两个表,主表和从表的关联字段名称不同,但依然可以建立外键:

主表:customer(存储客户信息) 说明
字段名:customer_id 主键,数据类型 INT(11) UNSIGNED
其他字段:namephone 客户姓名、电话
从表:order(存储订单信息) 说明
字段名:order_id 主键,订单唯一ID
字段名:buyer_id 关联主表的字段,数据类型与 customer.customer_id 完全一致(INT(11) UNSIGNED
其他字段:order_timeamount 下单时间、订单金额

即使从表关联字段叫 buyer_id,主表被引用字段叫 customer_id,依然可以通过SQL语句创建外键约束,核心是明确「从表字段」和「主表字段」的对应关系:

-- 给从表 order 的 buyer_id 字段添加外键,引用主表 customer 的 customer_id
ALTER TABLE `order`
ADD CONSTRAINT `fk_order_buyer_customer`  -- 外键约束的名称(自定义,便于识别)
FOREIGN KEY (`buyer_id`)                  -- 从表的关联字段(名字:buyer_id)
REFERENCES `customer` (`customer_id`);    -- 主表名 + 主表被引用字段(名字:customer_id)

执行后,order.buyer_id 就成为了关联 customer.customer_id 的外键,具备外键的所有约束逻辑(如从表插入的 buyer_id 必须在主表 customer_id 中存在,删除主表客户时受 ON DELETE 规则限制等)。

注意:虽然字段名可以不同,但我们还是建议让字段名体现关联语义,增强代码的可读性

我能不能在从表中修改外键值?

可以,前提是你修改后的新值必须是主表中已存在的被引用字段值(如主表的 customer_id),比如

-- 将从表的外键值从1改为2(主表中存在customer_id=2)
UPDATE `order` SET customer_id=2 WHERE order_id=100;

这个订单原来关联的是客户100,修改之后将该订单将关联到客户 2,不违反外键约束。

但是若新值在主表中不存在,会触发外键约束报错,操作失败。若从表中外键允许 NULL,我们也可将外键值改为 NULL(表示取消关联);

从表和主表的关联列表项是不是一一映射的关系?

一一映射指主表一条记录只能对应从表一条记录(一对一),但外键的核心逻辑是 “从表多记录对应主表一条记录”(多对一),这是业务场景的普遍需求,例如:
主表customer(客户):1 条记录(customer_id=1)代表 1 个客户;
从表order(订单):可以有 10 条记录的外键列(buyer_id=1),代表该客户下了 10 个订单。
这种情况下,主表的customer_id=1对应从表的 10 条buyer_id=1的记录,显然不是 “一一映射”,而是 “多对一”。
只有在特殊业务场景(如 “一对一关联”,例如user表和user_profile表,1 个用户对应 1 个资料),才会通过额外约束(如从表外键列设为唯一键)实现 “一一映射”,但这是额外配置,并非外键的默认行为。

在上面的例子中,两个表通过customer_id这个外键关联,请问这两个表中customer_id这一列是不是实时同步的?

这个要看你设置的外键约束,比如本例中我们在添加外键约束时设置了ON UPDATE CASCADE级联更新规则,那确实会同步。但你要是不设置,那就不会自动同步,而是会报错

  1. 默认情况:如果创建外键时未指定ON UPDATE规则,当主表中被关联的主键值修改时,从表的外键值不会自动更新,此时会直接报错(因为外键约束不允许从表存在主表中不存在的值)。

  2. 设置同步规则:若要实现关联列的实时同步,需在创建外键时明确指定ON UPDATE CASCADE(级联更新)规则。例如:

    -- 订单表(从表)关联客户表(主表),设置级联更新
    ALTER TABLE `order`
    ADD CONSTRAINT fk_order_customer
    FOREIGN KEY (customer_id)
    REFERENCES customer(customer_id)
    ON UPDATE CASCADE; -- 关键规则:主表ID更新时,从表自动同步
    

    此时,当客户表的customer_id(主键)修改后,订单表中对应的customer_id(外键)会自动实时同步更新

  3. 其他更新规则:除了CASCADE,还有其他规则决定是否同步:

    • ON UPDATE RESTRICT(默认):禁止修改主表的主键值(如果从表有引用)
    • ON UPDATE SET NULL:主表主键修改时,从表外键设为NULL(需外键允许NULL)
    • ON UPDATE NO ACTION:同RESTRICT,不允许修改

总结:外键关联列的实时同步不是默认行为,需要通过ON UPDATE CASCADE显式配置才能实现。

什么是外键约束?为什么要有外键约束?

假如说我现在不用外键关键词,仅仅从语义上也可以实现外键(即人为将两张表中的某一列设置为完全一样,然后同步修改),比如下图两张表
在这里插入图片描述

但这里有个问题,比如说
在这里插入图片描述

上图中插入的王五,它班级是1005,但是在我的Class根本没有1005,也就是说这是一条错误的信息。但是仅仅在道德/语义层面上建立起的外键,无法阻止这样一条错误信息的插入。

如何解决上述问题呢?

答案就是通过mysql提供的关键字foreign key,设置外键约束!有了外键约束,这才真正将两张表中的class_id关联在一起,这就相当于在法律层面上对其进行约束,在这种情况下就可以阻止错误信息的插入,当班级里还有人时,也可以阻止用户删除这个班级
设置外键约束的语法如下:
foreign key (外键) references + 主表名(关联外键)

总结来说,外键约束的作用就是保证主表和从表之间的数据一致性。有了外键约束,用户无法随意地向从表的外键栏插入主表中没有的错误外键信息,也无法直接删除关联从表信息的主表信息,通过进一步地设置,我们还能实现关联值的同步更新

外键约束有哪些?怎么设置?

在 MySQL 中,外键约束通过 ON DELETEON UPDATE 两个关键字定义主表数据发生删除或更新时,从表的关联数据如何处理。具体有以下几类约束规则:

1. ON DELETE 约束(主表记录被删除时的规则)
  • ON DELETE RESTRICT(默认)
    禁止删除主表中被从表引用的记录。如果从表存在关联记录,删除主表记录会直接报错。
    例:若客户有订单,禁止删除该客户。

  • ON DELETE CASCADE(级联删除)
    删除主表记录时,自动删除从表中所有关联的记录。
    例:删除客户时,自动删除该客户的所有订单。

  • ON DELETE SET NULL(设为 NULL)
    删除主表记录时,将从表中关联的外键字段值设为 NULL
    条件:从表的外键字段必须允许 NULL(即定义时未加 NOT NULL)。
    例:删除客户时,将其订单的 customer_id 改为 NULL(表示订单暂时无所属客户)。

  • ON DELETE SET DEFAULT(设为默认值)
    删除主表记录时,将从表中关联的外键字段值设为定义的默认值。
    条件:从表的外键字段必须设置了 DEFAULT 默认值。
    例:若外键默认值为 0,删除客户后,订单的 customer_id 自动变为 0

  • ON DELETE NO ACTION
    行为与 RESTRICT 一致,仅在某些数据库中语义略有差异,MySQL 中等价于 RESTRICT

2. ON UPDATE 约束(主表记录被更新时的规则)
  • ON UPDATE RESTRICT(默认)
    禁止更新主表中被从表引用的字段值。如果从表存在关联记录,更新主表字段会直接报错。
    例:若客户有订单,禁止修改该客户的 customer_id

  • ON UPDATE CASCADE(级联更新)
    更新主表中被引用的字段值时,自动同步更新从表中所有关联的外键值。
    例:客户的 customer_id1 改为 100 时,其所有订单的 customer_id 也自动改为 100

  • ON UPDATE SET NULL(设为 NULL)
    更新主表中被引用的字段值时,将从表中关联的外键字段值设为 NULL
    条件:从表的外键字段允许 NULL

  • ON UPDATE SET DEFAULT(设为默认值)
    更新主表中被引用的字段值时,将从表中关联的外键字段值设为默认值。
    条件:从表的外键字段设置了 DEFAULT 默认值。

  • ON UPDATE NO ACTION
    行为与 RESTRICT 一致,MySQL 中等价于 RESTRICT

示例:组合使用约束
CREATE TABLE `order` (
  order_id INT PRIMARY KEY,
  customer_id INT NOT NULL,
  FOREIGN KEY (customer_id) 
  REFERENCES customer(customer_id)
  ON DELETE CASCADE  -- 删除客户时,自动删除其所有订单
  ON UPDATE CASCADE  -- 更新客户ID时,自动同步订单的客户ID
);

外键约束的核心作用是维护主从表数据的一致性,有了外键约束,两张表才算真正关联了起来

外键和外键约束有什么区别?

外键指的是表中具体某一列属性,外键约束是给某个属性加了外键之后达到的效果