我不完全确定您所说的“错误的 ID 输入”是什么意思,但我假设您的意思是一个无效的 ID,而不仅仅是一个错误(比如说某人在与他们真正所在的城市不同的城市)是)。
外键约束意味着他们在表中输入的值person
必须作为表中city_id
的主键存在city
。他们不能将任何旧值作为一个city_id
,只有有效值。如果city
不删除/更改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 小提琴)
您不会对匹配city
记录中的数据进行非规范化,因此如果纽约决定将其名称改回新阿姆斯特丹,那么这将是对city
记录的一次更新,您不必person
为人们触及任何记录在那个城市。
如果您尝试删除city
纽约的记录,您会收到错误 (ORA-02292),指出存在子记录。您可以将person
记录更新city_id
为 2 或 3,然后可以删除纽约。这个想法是,您不能意外地这样做并留下孤立的数据 -person_id
指向city
不再存在的 a 。
如果您尝试使用与值不匹配的值创建person
记录:city_id
city.id
insert into person (id, name, last_name, city_id)
values (2, 'Elvis', 'Presley', 4);
...然后你会得到一个错误(ORA-02291),即父键 - 即表id
中的匹配值city
- 不存在。
您可以在数据库概念指南中阅读有关外键的更多信息。