1

我只是想在互联网上搜索一些完成的答案之前确保我理解PRIMARY和关键关系。FOREIGN

让我们这样说:

我们有桌子CITY(ID-PK,CODE,NAME),我们有桌子PERSON(ID-PK,NAME,LASTNAME,CITY_ID-FK)

我很困惑,如果在这种情况下用户需要在表中输入外键?如果不知道用户需要申请哪个城市?如果用户需要输入外键,为什么要使用它,因为这样我们就为用户侧的操作留出了很多空间(等等。错误的 ID 输入......)

如何连接这两个表?什么是可识别的连接参考?或者在这个例子中用户需要输入一个外键?

我正在使用 ORACLE 数据库。我将不胜感激任何解释和示例。

4

3 回答 3

3

我不完全确定您所说的“错误的 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_idcity.id

insert into person (id, name, last_name, city_id)
values (2, 'Elvis', 'Presley', 4);

...然后你会得到一个错误(ORA-02291),即父键 - 即表id中的匹配值city- 不存在。

您可以在数据库概念指南中阅读有关外键的更多信息。

于 2013-06-16T21:35:45.477 回答
1

使用 whis 代码,您可以在 Person 表上添加一个约束以获得 City 表的外键

alter table PERSON
add constraint CONSTR_PERSON_CITY
foreign key (CITY_ID-FK)
references CITY (ID-PK);
于 2013-06-16T21:41:34.717 回答
0

请记住,如果 Person 表 City_ID 的值在 City 表中不存在,则尝试创建约束会给您一个错误。我花了一段时间才弄清楚为什么。

于 2015-06-03T17:22:54.487 回答