我不完全确定您所说的“错误的 ID 输入”是什么意思,但我假设您的意思是一个无效的 ID,而不仅仅是一个错误(比如说某人在另一个城市他们真正在哪里)。
外键约束意味着他们在person 表中为city_id 输入的值 必须作为city 表中的主键存在。他们不能将任何旧值作为city_id 放入,只能放入有效值。如果不删除/更改 person 表中的引用(例如更新到不同的有效值),或者 - 在这种情况下不太可能 - 级联删除以便任何 person city 的记录被删除。
假设您将表创建为:
create table city (id number primary key, code varchar2(2), name varchar2(30));
create table person (id number, name varchar2(30), last_name varchar2(30),
city_id number not null references city(id));
city 表中有三条记录:
insert into city (id, name) values (1, 'New York');
insert into city (id, name) values (2, 'London');
insert into city (id, name) values (3, 'Paris');
然后,您可以添加居住在纽约的person,包括该城市的 ID:
insert into person (id, name, last_name, city_id)
values (1, 'Michael', 'Bloomberg', 1);
(SQL Fiddle)
您不会对匹配的 city 记录中的数据进行非规范化处理,因此如果纽约决定将其名称改回新阿姆斯特丹,那么这将是对 city 记录的一次更新,您将不必碰任何person 那个城市的人的记录。
如果您尝试删除纽约的 city 记录,您会收到错误 (ORA-02292),指出存在子记录。您可以将person 记录更新为具有2 或3 的city_id,然后就可以删除纽约。这个想法是,您不能意外地执行此操作并留下孤立的数据 - person_id 指向不再存在的 city。
如果您尝试使用与city.id 值不匹配的city_id 值创建person 记录:
insert into person (id, name, last_name, city_id)
values (2, 'Elvis', 'Presley', 4);
...然后您会收到一个错误 (ORA-02291),即父键 - 即 city 表中匹配的 id 值 - 不存在。
您可以在the database concepts guide 中阅读有关外键的更多信息。