Mysql 简明教程

MySQL - Foreign Key

在 MySQL 中, Foreign Key 是表中的列(或多列组合),其值与另一个表中主键列的值匹配。因此,使用外键,我们可以将两个表链接在一起。

外键也称为表的引用键,因为它可以引用任何唯一字段。

除了链接到表外,外键约束还通过防止主键表中的数据更改使到外键表数据的链接无效来确保引用完整性。即,外键防止操作(如“删除表”)消除两个表之间的连接。

Creating MySQL Foreign Key

我们可以使用 CREATE TABLE 语句中的 CONSTRAINT…FOREIGN KEY…REFERENCES 关键字在 MySQL 表上创建外键。

Syntax

以下是向表的列中添加外键约束的语法 −

CREATE TABLE table2(
   column1 datatype,
   column2 datatype,
   ...
   CONSTRAINT constraint_name
   FOREIGN KEY (column2)
   REFERENCES table1(column1)
);

Example

让我们使用 CREATE TABLE 语句创建一个名为 CUSTOMERS 的表 −

CREATE TABLE CUSTOMERS (
   ID INT NOT NULL,
   NAME VARCHAR (20) NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR (25) UNIQUE,
   SALARY DECIMAL (18, 2),
   PRIMARY KEY(ID)
);

为了说明外键,我们需要两个表,因此让我们再创建一个表 −

CREATE TABLE ORDERS (
   OID INT NOT NULL,
   DATE VARCHAR (20) NOT NULL,
   CUSTOMER_ID INT NOT NULL,
   AMOUNT DECIMAL (18, 2),
   CONSTRAINT fk_customers FOREIGN KEY (CUSTOMER_ID)
   REFERENCES CUSTOMERS(ID)
);

Verification

为了验证是否创建了外键,让我们使用以下语句删除 CUSTOMERS 表而不删除 ORDERS 表 −

DROP TABLE CUSTOMERS;

将显示如下错误 −

ERROR 3730 (HY000): Cannot drop table 'customers' referenced by a foreign key constraint 'fk_customers' on table 'orders'.

Creating Foreign Key on Existing Column

我们还可以在现有表的列上使用 ALTER TABLE…ADD CONSTRAINT 语句创建外键约束。

Syntax

以下是向现有表添加外键约束的语法 −

ALTER TABLE table_name2
ADD CONSTRAINT constraint_name
FOREIGN KEY(column_name2)
REFERENCES table_name1(column_name1);

Example

以下 MySQL 查询向现有 ORDERS 表的现有列中添加外键约束 FK_CUSTOMERS,该约束引用 CUSTOMERS 表的主键 −

ALTER TABLE ORDERS
ADD CONSTRAINT FK_CUSTOMERS
FOREIGN KEY(CUSTOMER_ID)
REFERENCES CUSTOMERS(ID);

Output

显示的表结构将在 CUSTOMER_ID 列上包含外键约束,如下所示 −

Verification

为了验证我们在 ORDERS 表上创建的外键是否引用 CUSTOMERS 表,让我们使用以下语句删除 CUSTOMERS 表而不删除 ORDERS 表 −

DROP TABLE CUSTOMERS;

将显示如下错误 −

ERROR 3730 (HY000): Cannot drop table 'customers' referenced by a foreign key constraint 'fk_customers' on table 'orders'.

Dropping MySQL Foreign Key

当表中不再需要时,还可以删除在 MySQL 表上创建的外键。我们可以使用 MySQL 中的 ALTER TABLE…DROP CONSTRAINT 语句执行此操作。

Syntax

以下是从表中删除外键的语法 −

ALTER TABLE table_name DROP CONSTRAINT constraint_name;

Example

使用以下 MySQL 查询,我们正在从表中删除外键约束 −

ALTER TABLE CUSTOMERS DROP CONSTRAINT fk_customers;

Verification

使用以下查询删除 CUSTOMERS 表,从而让我们验证是否删除了外键:

DROP TABLE CUSTOMERS;

Primary Key vs Foreign Key

即使主键和外键均引用同一列,但它们的工作方式有很多不同之处。它们列在下面。

Creating Foreign Key Using Client Program

我们还可以使用客户端程序对表字段应用外键约束。

Syntax

Example

以下是这些程序 −