SQLite FOREIGN KEY 约束用于将两个表链接在一起。外键由一个表中的单列或多列组成,该表引用另一表中的主键。包含外键的表称为子表。被引用的表称为被引用表或父表。
FOREIGN KEY 约束有助于保留两个表之间的链接。它可以防止在外键列中插入无效数据。可以插入到外键列中的值必须是引用表中包含的值。
考虑一个数据库,其中包含名为 Employee 和 Contact_Info 包含以下记录:
表 1:employee 表
EmpID | Name | City | Age | Salary |
---|---|---|---|---|
1 | John | London | 25 | 3000 |
2 | Marry | New York | 24 | 2750 |
3 | Jo | Paris | 27 | 2800 |
4 | Kim | Amsterdam | 30 | 3100 |
表 2:Contact_Info 表
Phone_Number | EmpID | Name | Address |
---|---|---|---|
+1-8054098000 | 2 | Marry | Brooklyn, New York, USA |
+33-147996101 | 3 | Jo | Grenelle, Paris, France |
+31-201150319 | 4 | Kim | Geuzenveld, Amsterdam, Netherlands |
Employee 表中的 EmpID 列是employee表主键。 Contact_Info 表中的 EmpID 列是 Contact_Info 表中的外键。
SQLite CREATE TABLE FOREIGN KEY 约束
下面提到的语句创建 Contact_Info 表,并将 FOREIGN KEY 约束应用于列 EmpID。
CREATE TABLE Contact_Info (
Phone_Number VARCHAR(100),
EmpID INT NOT NULL,
PersonName VARCHAR(255),
Address VARCHAR(255),
FOREIGN KEY (EmpID) REFERENCES Employee(EmpID)
);
要为 FOREIGN KEY 约束提供名称,并在多个列上定义 FOREIGN KEY 约束,语句如下:
CREATE TABLE Contact_Info (
Phone_Number VARCHAR(100),
EmpID INT NOT NULL,
PersonName VARCHAR(255),
Address VARCHAR(255),
CONSTRAINT FK_Contact_Info FOREIGN KEY (EmpID)
REFERENCES Employee(EmpID)
);
下面给出的语句演示了如何应用 FOREIGN KEY 约束多列(EmpID 和 PersonName)。请注意,Employee 表必须对这些列有 PRIMARY KEY 约束 - EmpID 和 Name。
CREATE TABLE Contact_Info (
Phone_Number VARCHAR(100),
EmpID INT NOT NULL,
PersonName VARCHAR(255),
Address VARCHAR(255),
CONSTRAINT FK_Contact_Info FOREIGN KEY (EmpID, PersonName)
REFERENCES Employee(EmpID, Name)
);
SQLite ALTER TABLE FOREIGN KEY 约束
SQLite 不支持 ALTER TABLE 语句向现有表添加 FOREIGN KEY。但是,这可以通过以下步骤来实现:
- 应检查外键约束
- 将表重命名为其他名称
- 创建一个结构相同但添加了外键约束的新表
- 将重命名表中的数据复制到新表
- 最后打开外键约束
例如,要对现有表 Contact_Info 的 EmpID 列强制执行 FOREIGN KEY 约束,可以使用以下语句:
PRAGMA foreign_keys=off;
BEGIN TRANSACTION;
ALTER TABLE Contact_Info RENAME TO Contact_Info_old;
CREATE TABLE Contact_Info (
Phone_Number VARCHAR(100),
EmpID INT NOT NULL,
PersonName VARCHAR(255),
Address VARCHAR(255),
FOREIGN KEY (EmpID) REFERENCES Employee(EmpID)
);
INSERT INTO Contact_Info SELECT * FROM Contact_Info_old;
COMMIT;
PRAGMA foreign_keys=on;
删除 FOREIGN KEY 约束
SQLite 不支持 ALTER TABLE 或 DROP 语句来从表中删除现有的 FOREIGN KEY 约束。为此,可以使用以下步骤:
- 应检查外键约束
- 将表重命名为其他名称
- 创建一个结构相同但删除外键约束的新表
- 将重命名表中的数据复制到新表
- 最后打开外键约束
例如,要从现有表 Contact_Info 的 EmpID 列中删除 FOREIGN KEY 约束,可以使用以下语句:
PRAGMA foreign_keys=off;
BEGIN TRANSACTION;
ALTER TABLE Contact_Info RENAME TO Contact_Info_old;
CREATE TABLE Contact_Info (
Phone_Number VARCHAR(100),
EmpID INT NOT NULL,
PersonName VARCHAR(255),
Address VARCHAR(255)
);
INSERT INTO Contact_Info SELECT * FROM Contact_Info_old;
COMMIT;
PRAGMA foreign_keys=on;