- SQL 教程
- SQL - 首页
- SQL - 概述
- SQL - RDBMS 概念
- SQL - 数据库
- SQL - 语法
- SQL - 数据类型
- SQL - 运算符
- SQL - 表达式
- SQL 数据库
- SQL - 创建数据库
- SQL - 删除数据库
- SQL - 选择数据库
- SQL - 重命名数据库
- SQL - 显示数据库
- SQL - 备份数据库
- SQL 表
- SQL - 创建表
- SQL - 显示表
- SQL - 重命名表
- SQL - 截断表
- SQL - 克隆表
- SQL - 临时表
- SQL - 修改表
- SQL - 删除表
- SQL - 删除表
- SQL - 约束
- SQL 查询
- SQL - 插入查询
- SQL - 选择查询
- SQL - SELECT INTO
- SQL - INSERT INTO SELECT
- SQL - 更新查询
- SQL - 删除查询
- SQL - 排序结果
- SQL 视图
- SQL - 创建视图
- SQL - 更新视图
- SQL - 删除视图
- SQL - 重命名视图
- SQL 运算符和子句
- SQL - WHERE 子句
- SQL - TOP 子句
- SQL - DISTINCT 子句
- SQL - ORDER BY 子句
- SQL - GROUP BY 子句
- SQL - HAVING 子句
- SQL - AND & OR
- SQL - 布尔 (BIT) 运算符
- SQL - LIKE 运算符
- SQL - IN 运算符
- SQL - ANY, ALL 运算符
- SQL - EXISTS 运算符
- SQL - CASE
- SQL - NOT 运算符
- SQL - 不等于
- SQL - IS NULL
- SQL - IS NOT NULL
- SQL - NOT NULL
- SQL - BETWEEN 运算符
- SQL - UNION 运算符
- SQL - UNION 与 UNION ALL
- SQL - INTERSECT 运算符
- SQL - EXCEPT 运算符
- SQL - 别名
- SQL 连接
- SQL - 使用连接
- SQL - 内连接
- SQL - 左连接
- SQL - 右连接
- SQL - 交叉连接
- SQL - 全连接
- SQL - 自连接
- SQL - 删除连接
- SQL - 更新连接
- SQL - 左连接与右连接
- SQL - UNION 与 JOIN
- SQL 密钥
- SQL - 唯一键
- SQL - 主键
- SQL - 外键
- SQL - 组合键
- SQL - 备选键
- SQL 索引
- SQL - 索引
- SQL - 创建索引
- SQL - 删除索引
- SQL - 显示索引
- SQL - 唯一索引
- SQL - 集群索引
- SQL - 非集群索引
- 高级 SQL
- SQL - 通配符
- SQL - 注释
- SQL - 注入
- SQL - 托管
- SQL - MIN & MAX
- SQL - NULL 函数
- SQL - 检查约束
- SQL - 默认约束
- SQL - 存储过程
- SQL - NULL 值
- SQL - 事务
- SQL - 子查询
- SQL - 处理重复项
- SQL - 使用序列
- SQL - 自动递增
- SQL - 日期和时间
- SQL - 游标
- SQL - 公共表表达式
- SQL - GROUP BY 与 ORDER BY
- SQL - IN 与 EXISTS
- SQL - 数据库调优
- SQL 函数参考
- SQL - 日期函数
- SQL - 字符串函数
- SQL - 聚合函数
- SQL - 数值函数
- SQL - 文本和图像函数
- SQL - 统计函数
- SQL - 逻辑函数
- SQL - 游标函数
- SQL - JSON 函数
- SQL - 转换函数
- SQL - 数据类型函数
- SQL 有用资源
- SQL - 问答
- SQL - 快速指南
- SQL - 有用函数
- SQL - 有用资源
- SQL - 讨论
SQL - 外键
SQL 外键
在 SQL 中,外键是表中的一列,它与另一表中的主键匹配,从而允许将这两个表连接在一起。
外键还维护两个表之间的参照完整性,使得无法删除包含主键的表(保留表之间的连接)。
外键可以引用数据库中任何表的唯一字段。具有主键的表称为父表,具有外键的表称为子表。
让我们考虑一个示例场景,假设我们有两个表,名为 CUSTOMERS (ID, NAME, AGE, ADDRES, SALARY) 和 ORDERS (ID, DATE, CUSTOMER_ID, AMOUNT)。这里客户的 ID 是 CUSTOMERS 表中的主键 (ID),也是 ORDERS (CUSTOMER_ID) 表中的外键,请观察下图:
外键的特性
以下是外键的特性:
外键用于减少表中的冗余(或重复)。
它有助于规范化(或组织数据库中的数据)多个表中的数据。
语法
以下是为 MySQL 数据库中表的列添加外键约束的基本语法:
CREATE TABLE table_name ( column1 datatype, column2 datatype, ... CONSTRAINT fk_name FOREIGN KEY (column_name) REFERENCES referenced_table(referenced_column) );
示例
让我们创建两个名为 CUSTOMERS 和 ORDERS 的表。以下查询创建一个名为 CUSTOMERS 的表:
CREATE TABLE CUSTOMERS( ID INT NOT NULL, NAME VARCHAR (20) NOT NULL, AGE INT NOT NULL, ADDRESS CHAR (25) , SALARY DECIMAL (18, 2), PRIMARY KEY (ID) );
输出
以下是上述 SQL 语句的输出:
Query OK, 0 rows affected (0.02 sec)
现在,让我们创建 ORDERS 表。在此过程中,我们在 CUSTOMER_ID 列上添加外键约束,引用 CUSTOMERS 表的 ID 列,如下面的语句所示:
CREATE TABLE ORDERS ( ID INT NOT NULL, DATE DATETIME, CUSTOMER_ID INT, CONSTRAINT FK_CUSTOMER FOREIGN KEY(CUSTOMER_ID) REFERENCES CUSTOMERS(ID), AMOUNT DECIMAL, PRIMARY KEY (ID) );
输出
上述语句产生以下输出:
Query OK, 0 rows affected (0.04 sec)
验证
我们在 ORDERS 表的 CUSTOMER_ID 列上创建了一个外键约束,该约束引用了 CUSTOMERS 表的 ID 列;因此,在删除 table2 (ORDERS) 之前,不能删除 table1 (CUSTOMERS)。
首先,让我们使用 DROP TABLE 语句删除 CUSTOMERS 表而不删除 ORDERS 表:
DROP TABLE CUSTOMERS;
如果您验证下面的错误消息,您会发现它指出该表无法删除,因为它被外键约束引用。
ERROR 3730 (HY000): Cannot drop table 'customers' referenced by a foreign key constraint 'FK_CUSTOMER' on table 'orders'.
现有列上的外键约束
我们还可以为现有表的列创建外键约束。当您在创建表时忘记为列添加外键约束,或者即使表中存在一个外键列,也希望在此列上添加此约束时,这很有用。
语法
使用 ALTER TABLE 语句,我们可以如下所示在 MySQL 数据库中表的现有列上添加外键约束:
ALTER TABLE TABLE2 ADD CONSTRAINT[symbol] FOREIGN KEY(column_name) REFERENCES TABLE1(column_name);
这里,FK_ORDERS 是外键约束的名称。指定约束名称是可选的,但在删除约束时非常方便。
示例
假设 CUSTOMERS 和 ORDERS 表已在 SQL 数据库中创建。现在,我们将为 ORDERS 表的 ID 列添加外键约束。
以下是为现有表的列添加外键约束的 SQL 查询:
ALTER TABLE ORDERS ADD CONSTRAINT FK_ORDERS FOREIGN KEY(ID) REFERENCES CUSTOMERS(ID);
输出
以下是上述程序的输出:
Query OK, 0 rows affected (0.04 sec) Records: 0 Duplicates: 0 Warnings: 0
验证
我们在 ORDERS 表的 CUSTOMER_ID 列上创建了一个外键约束,该约束引用了 CUSTOMERS 表的 ID 列。因此,在删除 table2 (ORDERS) 之前,不能删除 table1 (CUSTOMERS)。
首先,让我们通过执行以下语句删除 CUSTOMERS 表而不删除 ORDERS 表:
DROP TABLE CUSTOMERS;
这会生成一条错误消息,指出该表无法删除,因为它被外键约束引用。
ERROR 3730 (HY000): Cannot drop table 'customers' referenced by a foreign key constraint 'FK_CUSTOMER' on table 'orders'.
删除外键
您可以使用 ALTER TABLE 语句从表中删除外键,而无需删除整个表。
语法
以下是使用 ALTER TABLE 语句从表的列中删除外键约束的语法:
ALTER TABLE table_name DROP FOREIGN KEY (constraint symbol);
其中,FK_NAME 是您需要删除的外键约束的名称。
示例
删除表列外键约束的 SQL 查询如下:
ALTER TABLE ORDERS DROP FOREIGN KEY FK_ORDERS;
输出
以下是上述 SQL 查询的输出:
Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0
验证
由于我们已从 ORDERS 表中删除了外键约束,因此您现在可以直接删除 CUSTOMERS 表而不删除 ORDERS 表,如下所示:
DROP TABLE CUSTOMERS;
如果您验证上述 SQL 命令抛出的以下状态代码,您会发现 CUSTOMERS 表已删除。
Query OK, 0 rows affected (0.02 sec)
主键与外键
即使主键和外键都引用同一列,它们的工作方式也存在许多差异。这些差异列在下面:
主键 | 外键 |
---|---|
主键总是唯一的。 | 外键可以重复。 |
主键不能为 NULL。 | 外键可以为 NULL。 |
一个表只能包含一个主键。 | 每个表可以有多个外键。 |