外键是一个表的字段,不是本表的主键,但对应另一个表的主键。外键主要用来在两个表的数据之间建立连接,可以是一列或者多列。一个表可以有一个或者多个外键。
外键对应的是参照完整性,一个表的外键可以为空值,若不为空,则外键的值必须等于另一个表中的主键的某个值。
让我们通过一个实例来解释外键。请看下面两个表:
"Persons" 表:
P_Id | FirstName | FirstName | Address | City |
---|---|---|---|---|
1 | Hansen | Ola | Timoteivn 10 | Sandnes |
2 | Svendson | Tove | Borgvn 23 | Sandnes |
3 | Pettersen | Kari | Storgt 20 | Stavanger |
"Orders" 表:
O_Id | OrderNo | P_Id |
---|---|---|
1 | 77895 | 3 |
2 | 44678 | 3 |
3 | 22456 | 2 |
4 | 24562 | 1 |
请注意,"Orders" 表中的 "P_Id" 列指向 "Persons" 表中的 "P_Id" 列。"Persons" 表中的 "P_Id" 列是 "Persons" 表中的 主键(PRIMARY KEY)。"Orders" 表中的 "P_Id" 列是 "Orders" 表中的 外键约束(FOREIGN KEY)。
外键约束(FOREIGN KEY) 主要作用是保持数据的一致性、完整性。例如:”Orders”表中的字段”P_Id”值必须对应“Persons”表中字段”P_Id”的某一个值。
(1) CREATE TABLE 时的 SQL FOREIGN KEY 约束
下面的 SQL 在 "Orders" 表创建时在 "P_Id" 列上创建 FOREIGN KEY 约束:
MySQL:
CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
PRIMARY KEY (O_Id),
FOREIGN KEY (P_Id) REFERENCES Persons(P_Id)
)
SQL Server / Oracle:
CREATE TABLE Orders
(
O_Id int NOT NULL PRIMARY KEY,
OrderNo int NOT NULL,
P_Id int FOREIGN KEY REFERENCES Persons(P_Id)
)
如需命名 FOREIGN KEY 约束,并定义多个列的 FOREIGN KEY 约束,请使用下面的 SQL 语法:
CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
PRIMARY KEY (O_Id),
CONSTRAINT fk_PerOrders FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)
)
(2) ALTER TABLE 时的 SQL FOREIGN KEY 约束
当 "Orders" 表已被创建时,如需在 "P_Id" 列创建 FOREIGN KEY 约束,请使用下面的 SQL:
ALTER TABLE Orders
ADD FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)
如需命名 FOREIGN KEY 约束,并定义多个列的 FOREIGN KEY 约束,请使用下面的 SQL 语法:
ALTER TABLE Orders
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)
(3) 撤销 FOREIGN KEY 约束
如需撤销 FOREIGN KEY 约束,请使用下面的 SQL:
MySQL:
ALTER TABLE Orders
DROP FOREIGN KEY fk_PerOrders
SQL Server / Oracle:
ALTER TABLE Orders
DROP CONSTRAINT fk_PerOrders
资料来源:
SQL 约束(Constraints) https://www.runoob.com/sql/sql-constraints.html
SQL FOREIGN KEY 约束 https://www.runoob.com/sql/sql-foreignkey.html