外键

一个表中的 FOREIGN KEY 指向另一个表中的 UNIQUE KEY(唯一约束的键)。

让我们通过一个实例来解释外键。请看下面两个表:

"teachers" 教师表:

"courses" 课程表:

注意:

"courses" 表中的 "teacher_id" 列指向 "teachers" 表中的 "id" 列。

"teachers" 表中的 "id" 列是 "teachers" 表中的 PRIMARY KEY。

"courses" 表中的 "teacher_id" 列是 "courses" 表中的 FOREIGN KEY。

FOREIGN KEY 约束用于预防破坏表之间连接的行为。

FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。

1 创建表时创建 FOREIGN KEY 约束

下面的 SQL 在 "courses" 表创建时在 "teacher_id" 列上创建 FOREIGN KEY 约束:

MySQL

CREATE TABLE courses
  (
     id       INT NOT NULL,
     name     VARCHAR(64) NOT NULL,
     student_count   INT NOT NULL,
     created_at      DATE NOT NULL,
     teacher_id       INT NOT NULL,
     PRIMARY KEY (id),
     FOREIGN KEY (teacher_id) REFERENCES teachers(id)
  )

SQL Server/ Oracle/ MS Access

CREATE TABLE courses
  (
     id       INT NOT NULL PRIMARY KEY,
     name     VARCHAR(64) NOT NULL,
     student_count   INT NOT NULL,
     created_at      DATE NOT NULL,
     teacher_id       INT FOREIGN KEY REFERENCES teachers(id)
  )

其中

NOT NULL 表示该字段不为空

REFERENCES 表示引用一个表

如需命名 FOREIGN KEY 约束,并定义多个列的 FOREIGN KEY 约束,请使用下面的 SQL 语法:

MySQL / SQL Server / Oracle / MS Access:

CREATE TABLE courses
  (
     id       INT NOT NULL,
     name     VARCHAR(64) NOT NULL,
     student_count   INT NOT NULL,
     created_at      DATE NOT NULL,
     teacher_id       INT NOT NULL,
     PRIMARY KEY (id),
     CONSTRAINT fk_teachers FOREIGN KEY (teacher_id) REFERENCES teachers(id)
  )

其中

CONSTRAINT 表示约束,后面接约束名称,常用于创建约束和删除约束。

2 创建表后通过 ALTER TABLE 创建 FOREIGN KEY 约束

当 "courses" 表已被创建时,如需在 "course_id" 列创建 FOREIGN KEY 约束,请使用下面的 SQL:

MySQL / SQL Server / Oracle / MS Access

ALTER TABLE courses
ADD FOREIGN KEY (teacher_id) REFERENCES teachers(id)

如需命名 FOREIGN KEY 约束,并定义多个列的 FOREIGN KEY 约束,请使用下面的 SQL 语法:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE courses
ADD CONSTRAINT fk_teachers FOREIGN KEY (teacher_id) REFERENCES teachers(id)

3 撤销 FOREIGN KEY 约束

如需撤销 FOREIGN KEY 约束,请使用下面的 SQL:

MySQL

ALTER TABLE courses
DROP FOREIGN KEY fk_teachers

SQL Server / Oracle / MS Access

ALTER TABLE courses
DROP CONSTRAINT fk_teachers

Last updated

Was this helpful?