【问题标题】:how to insert foreign key in a table如何在表中插入外键
【发布时间】:2013-06-16 21:34:36
【问题描述】:

我只是想在网上搜索一些完整的答案之前,确保我了解PRIMARYFOREIGN 的关键关系。

让我们这样说:

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

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

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

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

【问题讨论】:

    标签: sql oracle foreign-keys primary-key


    【解决方案1】:

    我不完全确定您所说的“错误的 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 中阅读有关外键的更多信息。

    【讨论】:

    • 所以基本上我需要在表中插入一个外键?让我感到困惑的是,我认为我需要以某种方式动态插入外键,但我没有引用它,因为我无法确定某个人来自哪个城市。对吗?
    • 我不确定您所说的无法确定一个人来自哪个城市是什么意思。不知何故,这必须在您的输入数据中。如果您知道他们来自伦敦,您将查找与该名称匹配的city.id,并将其用作person.city_id 值。如果您不知道这个城市,city_id 必须可以为空并且您可以将其留空。我想我错过了一些东西......
    • 不,Alex 你在回答我的问题,但我需要更好地形成它们 :) 我的简化问题是:在这个例子中用户是否输入了外键?
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2020-09-13
        • 1970-01-01
        • 1970-01-01
        • 2011-06-11
        • 2022-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多