假设您希望确保所有员工均属于一个有效的部门。这就是所谓的维护数据的引用完整性。在十分简单的数据库系统中,这将通过以下方法实现(如果可行):先查看 dept 表以检查是否存在匹配的记录,然后插入或拒绝新员工记录。这种方法存在许多问题,而且非常不方便。PolarDB PostgreSQL版(兼容Oracle)可让您更轻松地工作。

本节中显示了 emp 表(在第 2.1.2 节中进行了介绍)的修改后版本,其中新增了外键约束。修改后的 emp 表如下所示:

CREATE TABLE emp (
    empno           NUMBER(4) NOT NULL CONSTRAINT emp_pk PRIMARY KEY,
    ename           VARCHAR2(10),
    job             VARCHAR2(9),
    mgr             NUMBER(4),
    hiredate        DATE,
    sal             NUMBER(7,2),
    comm            NUMBER(7,2),
    deptno          NUMBER(2) CONSTRAINT emp_ref_dept_fk
                        REFERENCES dept(deptno)
);

如果尝试在示例 emp 表中发出以下 INSERT 命令,则外键约束 emp_ref_dept_fk 可确保 dept 表中存在部门 50。由于不存在该部门,该命令被拒绝。

INSERT INTO emp VALUES (8000,'JONES','CLERK',7902,'17-AUG-07',1200,NULL,50);

ERROR:  insert or update on table "emp" violates foreign key constraint "emp_ref_dept_fk"
DETAIL:  Key (deptno)=(50) is not present in table "dept".

外键约束的行为可根据应用程序进行微调。正确使用外键确实会提高数据库应用程序的质量,因此强烈建议您更多地了解它们。