Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何从多个列引用外键(值不一致)_Sql_Oracle_Foreign Keys - Fatal编程技术网

Sql 如何从多个列引用外键(值不一致)

Sql 如何从多个列引用外键(值不一致),sql,oracle,foreign-keys,Sql,Oracle,Foreign Keys,我有三张桌子: 第一个是EMP: 第二个是汽车: 第三个是账户: 现在,我为所选表设置了以下值: 环境管理计划: 汽车: 我想 在accounts表中插入值,使其数据如下所示: 账户: 我尝试执行以下SQL语句: Insert into accounts (acc_id , woner_table , woner_id) values (11013,'EMPS',1); 但我得到了这个错误: ERROR at line 1: ORA-02291: integrity constraint (H

我有三张桌子:

第一个是EMP:

第二个是汽车:

第三个是账户:

现在,我为所选表设置了以下值:

环境管理计划:

汽车:

我想 在accounts表中插入值,使其数据如下所示:

账户:

我尝试执行以下SQL语句:

Insert into accounts (acc_id , woner_table , woner_id) values (11013,'EMPS',1);
但我得到了这个错误:

ERROR at line 1:
ORA-02291: integrity constraint (HR.SYS_C0016548) violated - parent key not found.
发生此错误的原因是cars表中不存在woner_id列的值

我的工作需要这样的链接表

请问我怎样才能解决这个问题


意思是:如何以以前的方式引用表并插入值而不出现此问题?

您的方法应该更改,以便您的帐户表包含两个外键字段-每个外键表一个。像这样:

create table accounts (acc_id number primary key,
                       empsId number references emps(id),
                       carsId number references cars(id));

应该更改方法,使Account表包含两个外键字段-每个外键表一个。像这样:

create table accounts (acc_id number primary key,
                       empsId number references emps(id),
                       carsId number references cars(id));

其中一个关系在SQL中很棘手。对于您的数据结构,这里有一种可能性:

create table accounts (
    acc_id number primary key,
    emp_id number references emps(id),
    car_id number references car(id),
    id as (coalesce(emp_id, car_id)),
    woner_table as (case when emp_id is not null then 'Emps'
                         when car_id is not null then 'Cars'
                    end),
    constraint chk_accounts_car_emp check (emp_id is null or car_id is null)
);
您可以在select中获取id。但是,对于插入,您需要明确:

Insert into accounts (acc_id , emp_id)
    values (11013, 1);

注意:Oracle的早期版本不支持虚拟列,但您可以使用视图执行几乎相同的操作。

其中一个关系在SQL中很棘手。对于您的数据结构,这里有一种可能性:

create table accounts (
    acc_id number primary key,
    emp_id number references emps(id),
    car_id number references car(id),
    id as (coalesce(emp_id, car_id)),
    woner_table as (case when emp_id is not null then 'Emps'
                         when car_id is not null then 'Cars'
                    end),
    constraint chk_accounts_car_emp check (emp_id is null or car_id is null)
);
您可以在select中获取id。但是,对于插入,您需要明确:

Insert into accounts (acc_id , emp_id)
    values (11013, 1);

注意:Oracle的早期版本不支持虚拟列,但您可以使用视图执行几乎相同的操作。

最简单、最直接的方法是,如STLDeveloper所说,添加额外的FK列,每个表一个。这也带来了数据库能够强制引用完整性的好处


但是,如果您选择不这样做,则下一个选项是使用一个FK列作为FK值的索引,并使用第二列指示该值引用的表。这将使列数保持较小=2最大值,而与具有FKs的表数无关。但是,这大大增加了应用程序逻辑和/或PL/SQL、SQL的编程负担。当然,您完全失去了对RI的数据库强制。

最简单、最直接的方法是,如STLDeveloper所说,添加额外的FK列,每个表一个。这也带来了数据库能够强制引用完整性的好处


但是,如果您选择不这样做,则下一个选项是使用一个FK列作为FK值的索引,并使用第二列指示该值引用的表。这将使列数保持较小=2最大值,而与具有FKs的表数无关。但是,这大大增加了应用程序逻辑和/或PL/SQL、SQL的编程负担。当然,您完全失去了RI的数据库执行。

非常感谢您的帮助,但我的问题是:我有大约5个表要引用accounts表,如果我这样使用,这意味着我将向accounts表添加更多列,而这正是我试图避免的@Gordon Linoff非常感谢您的帮助,但我的问题是:我有大约5个表要引用accounts表,如果我这样使用,这意味着我将向accounts表添加更多列,而这正是我试图避免的@Gordon Linoff非常感谢您的帮助,但我的问题是:我有大约5个表要引用accounts表,如果我这样使用,这意味着我将向accounts表添加更多列,而这正是我试图避免的@STLDeveloperAs@Joe在他的回答中指出,如果只使用一列保存多个外键,另一列保存键值所属的表名,那么使用这种数据库结构将非常困难。您的代码将需要动态创建和执行SQL语句。除非您是SQL开发专家,否则我强烈建议您不要使用这种方法。非常感谢您,我在使用动态SQL时没有问题。再次感谢@stldeveloperon 2 cols方法的一个好处是为FK强制执行一个非空列,而使用多FK col方法则会丢失该列。在我看来,仍然没有理由使用它,但这是一个很好的好处。此外,多列方法有时会有第三列来指示FK列的数据类型。可以说,这是一个派生值,可以查找,但将其放入可以节省精力。非常感谢您的帮助,但我的问题是:我有大约5个表要引用accounts表,如果我这样使用,这意味着我将向accounts表中添加更多的列,而这正是我试图避免的@STLDeveloperAs@Joe在他的回答中指出,这样做的方式是只使用一根柱子来支撑mult
iple外键和另一列保存键值所属的表名将使使用此数据库结构非常困难。您的代码将需要动态创建和执行SQL语句。除非您是SQL开发专家,否则我强烈建议您不要使用这种方法。非常感谢您,我在使用动态SQL时没有问题。再次感谢@stldeveloperon 2 cols方法的一个好处是为FK强制执行一个非空列,而使用多FK col方法则会丢失该列。在我看来,仍然没有理由使用它,但这是一个很好的好处。此外,多列方法有时会有一个第三列来指示FK列的数据类型。可以说,它是一个派生值,可以查找、查找,但将其放入可以节省工作。该方法从一开始就有缺陷。您不应该在同一张表中包含有关EMP和cars的信息。emp可能有配偶、丈夫或妻子,或月薪等。;汽车不能。汽车可能有价格,也可能有颜色;emp不会。为什么您需要像您描述的那样的表或视图?上面的表只是为了解释我需要什么@mathguySo,是不是更像是有两个不同的employee表,并且想要将它们组合在一起?比如,一个显示一个位置的员工,另一个显示另一个位置的员工?这会更有意义。这种方法从一开始就是有缺陷的。您不应该在同一张表中包含有关EMP和cars的信息。emp可能有配偶、丈夫或妻子,或月薪等。;汽车不能。汽车可能有价格,也可能有颜色;emp不会。为什么您需要像您描述的那样的表或视图?上面的表只是为了解释我需要什么@mathguySo,是不是更像是有两个不同的employee表,并且想要将它们组合在一起?比如,一个显示一个位置的员工,另一个显示另一个位置的员工?这会更有意义。
create table accounts (acc_id number primary key,
                       empsId number references emps(id),
                       carsId number references cars(id));
create table accounts (
    acc_id number primary key,
    emp_id number references emps(id),
    car_id number references car(id),
    id as (coalesce(emp_id, car_id)),
    woner_table as (case when emp_id is not null then 'Emps'
                         when car_id is not null then 'Cars'
                    end),
    constraint chk_accounts_car_emp check (emp_id is null or car_id is null)
);
Insert into accounts (acc_id , emp_id)
    values (11013, 1);