如何在表中插入外键

时间:2013-06-16 21:34:36

标签: sql oracle foreign-keys primary-key

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

我们这样说:

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

我很困惑,如果在这种情况下用户需要在表格中输入外键?如果不知道如何知道哪个城市需要应用于用户?如果用户需要输入外键,那么为什么要这样做呢?因为这样我们就会留下很多空间用于操作用户端(等错误的ID输入...)

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

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

3 个答案:

答案 0 :(得分:3)

我不完全确定你的'错误的ID输入'是什么意思,但我会假设你的意思是一个无效的ID,而不仅仅是一个错误(就像说某人在不同的城市到他们真的在哪里。)

外键约束意味着它们在person city_id表中输入的值city表中作为主键存在。他们不能将任何旧值作为city_id,只有有效值。如果没有删除/更改city表中的引用(例如,更新为不同的有效值),或者 - 在这种情况下不太可能 - 级联删除,则不能删除相应的person行,以便<{1}}的所有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

然后,您可以通过添加该城市的ID来添加居住在纽约的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

SQL Fiddle

您没有对匹配的insert into person (id, name, last_name, city_id) values (1, 'Michael', 'Bloomberg', 1); 记录中的数据进行非规范化,因此如果纽约决定将其名称更改回新阿姆斯特丹,那么这将是对city的单一更新记录,您不必触及该城市中任何人的city记录。

如果您尝试删除纽约的person记录,则会收到错误消息(ORA-02292),表示存在子记录。您可以更新city记录,使person为2或3,然后就可以删除纽约。这个想法是你不能偶然做到这一点并留下孤立的数据 - city_id指向不再存在的person_id

如果您尝试创建的city记录的person值与city_id值不匹配:

city.id

...然后你会得到一个错误(ORA-02291)父键 - 即insert into person (id, name, last_name, city_id) values (2, 'Elvis', 'Presley', 4); 表中匹配的id值 - 不存在。

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

请记住,如果Person表City_ID具有City表中不存在的值,则尝试创建约束将导致错误。我花了一段时间才弄清楚原因。