Sql 如何在表中插入外键

Sql 如何在表中插入外键,sql,oracle,foreign-keys,primary-key,Sql,Oracle,Foreign Keys,Primary Key,我只是想在网上搜索一些已完成的答案之前,确保我了解主键和外键的关系 让我们这样说: 我们有表CITYID-PK、CODE、NAME,还有表PERSONID-PK、NAME、LASTNAME、CITY\u ID-FK 我很困惑,在这种情况下,用户是否需要在person表中输入外键?如果没有,如何知道哪个城市需要应用于用户?如果用户需要输入外键,为什么要输入外键,因为这样我们就为用户端的操作留下了很大的空间等等。错误的ID输入 如何连接这两个表?什么是可识别的连接参考?或者在本例中,用户需要输入外键

我只是想在网上搜索一些已完成的答案之前,确保我了解主键和外键的关系

让我们这样说:

我们有表CITYID-PK、CODE、NAME,还有表PERSONID-PK、NAME、LASTNAME、CITY\u ID-FK

我很困惑,在这种情况下,用户是否需要在person表中输入外键?如果没有,如何知道哪个城市需要应用于用户?如果用户需要输入外键,为什么要输入外键,因为这样我们就为用户端的操作留下了很大的空间等等。错误的ID输入

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


我正在使用ORACLE数据库。我希望能有任何解释和示例。

我不完全确定您所说的“错误的ID输入”是什么意思,但我假设您指的是无效的ID,而不仅仅是一个错误,比如说某人与他们实际所在的城市不同

外键约束意味着他们在city_id的person表中输入的值必须作为主键存在于city表中。他们不能将任何旧值作为城市id输入,只能输入有效值。然后,如果不删除/更改person表中的引用(例如更新为不同的有效值),或者(在这种情况下不太可能)级联删除以删除该城市的任何person记录,则无法删除相应的城市行

假设您将表创建为:

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));
您的城市表中有三条记录:

然后,您可以添加居住在纽约的人,包括该城市的ID:

insert into person (id, name, last_name, city_id)
values (1, 'Michael', 'Bloomberg', 1);

你没有对匹配的城市记录中的数据进行非规范化,因此,如果纽约决定将其名称改回新阿姆斯特丹,那么这将是对城市记录的一次更新,并且你不必接触该城市的任何个人记录

如果你试图删除纽约的城市记录,你会得到一个错误ORA-02292,说存在一个儿童记录。您可以将个人记录更新为城市id为2或3,然后可以删除纽约。我们的想法是,你不能因为意外而留下孤立的数据——一个人的id指向一个不再存在的城市

如果您试图使用与city.id值不匹配的city\u id值创建个人记录:

。。。然后,您将得到一个错误ORA-02291,即父密钥(即城市表中匹配的id值)不存在


您可以在中阅读有关外键的更多信息。

我不完全确定您所说的“错误的ID输入”是什么意思,但我假设您指的是无效的ID,而不仅仅是一个错误,比如说某人与他们实际所在的城市不同

外键约束意味着他们在city_id的person表中输入的值必须作为主键存在于city表中。他们不能将任何旧值作为城市id输入,只能输入有效值。然后,如果不删除/更改person表中的引用(例如更新为不同的有效值),或者(在这种情况下不太可能)级联删除以删除该城市的任何person记录,则无法删除相应的城市行

假设您将表创建为:

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));
您的城市表中有三条记录:

然后,您可以添加居住在纽约的人,包括该城市的ID:

insert into person (id, name, last_name, city_id)
values (1, 'Michael', 'Bloomberg', 1);

你没有对匹配的城市记录中的数据进行非规范化,因此,如果纽约决定将其名称改回新阿姆斯特丹,那么这将是对城市记录的一次更新,并且你不必接触该城市的任何个人记录

如果你试图删除纽约的城市记录,你会得到一个错误ORA-02292,说存在一个儿童记录。您可以将个人记录更新为城市id为2或3,然后可以删除纽约。我们的想法是,你不能因为意外而留下孤立的数据——一个人的id指向一个不再存在的城市

如果您试图使用与city.id值不匹配的city\u id值创建个人记录:

。。。然后,您将得到一个错误ORA-02291,即父密钥(即城市表中匹配的id值)不存在


您可以在中阅读有关外键的更多信息。

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

alter table PERSON
add constraint CONSTR_PERSON_CITY
foreign key (CITY_ID-FK)
references CITY (ID-PK);

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

alter table PERSON
add constraint CONSTR_PERSON_CITY
foreign key (CITY_ID-FK)
references CITY (ID-PK);

请记住,若人员表City\u ID的值在City表中不存在,则尝试创建约束将导致错误。我花了一段时间才弄明白原因。

请记住,如果Person表City\u ID的值在City表中不存在,尝试创建约束将导致错误。我吃了一顿饭
同时找出原因。

所以基本上我需要在表中插入外键?让我困惑的是,我认为我需要以某种方式动态插入外键,而我没有引用它,因为我无法确定某个人来自哪个城市。对吗?我不知道你说的不能确定一个人来自哪个城市是什么意思。这一定是你的输入数据。如果您知道他们来自伦敦,您可以查找与该名称匹配的city.id,并将其用作person.city\u id值。如果您不知道城市,那么城市id必须为空,您可以将其留空。我想我遗漏了一些东西……不,Alex,你在回答我的问题,但我需要更好地组织它们:我的简化问题是:在这个示例中,用户是否输入外键?所以基本上我需要在表中插入外键?让我困惑的是,我认为我需要以某种方式动态插入外键,而我没有引用它,因为我无法确定某个人来自哪个城市。对吗?我不知道你说的不能确定一个人来自哪个城市是什么意思。这一定是你的输入数据。如果您知道他们来自伦敦,您可以查找与该名称匹配的city.id,并将其用作person.city\u id值。如果您不知道城市,那么城市id必须为空,您可以将其留空。我想我遗漏了一些东西……不,Alex,你在回答我的问题,但我需要更好地组织它们:我的简化问题是:在这个示例中,用户是否输入外键?