Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.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
Database 插入具有多个值的外键_Database_Oracle - Fatal编程技术网

Database 插入具有多个值的外键

Database 插入具有多个值的外键,database,oracle,Database,Oracle,我想知道,是否有可能创建一个表,其中有一个表可以接受外键,但同一行可能有多个值 例如: Employee(id,name,skillid); Skill(Skillid,skillname); 这里可以是Employee的一个实例 Employee(311,"john", (01,02) ); Skill (01,Java); Skill (02,C++); 我为表实现了与(is,skillid)相同的主键生成 但在一个案例中,我有一张桌子: create table Movie (Movi

我想知道,是否有可能创建一个表,其中有一个表可以接受外键,但同一行可能有多个值

例如:

Employee(id,name,skillid);
Skill(Skillid,skillname);
这里可以是Employee的一个实例

Employee(311,"john", (01,02) );
Skill (01,Java); Skill (02,C++);
我为表实现了与(is,skillid)相同的主键生成

但在一个案例中,我有一张桌子:

create table Movie (Movie_ID varchar(5),                              
                            Cast varchar(5),
                            foreign key(Cast) references Person(Person_ID), 
                            primary key(movie_id, Cast));
另一张表:

create table Awards  (Award_Id varchar(5),
                                Person_Id varchar(5), 
                                Movie_Id varchar(5),
                                Award_Name  varchar(30),
                                Year number(4),
                                Organization_Id varchar(5),
                                primary key (Award_id,year,Organization_Id),
                                foreign key(Person_Id) references Person(Person_ID),
--                                foreign key(Movie_ID) references Movie(Movie_ID),
                                foreign key(Organization_Id) references Organization(Organization_Id));
在这种情况下,我不能使用Movie_ID作为外键,因为它引用的表有两个东西的组合作为它的主键。我没有使用奖励表中的第二个属性


有什么可以实现的提示吗?

不幸的是,你刚刚问了一个古老的问题

如何将两件事放在一列中

答案当然是,你没有;您有两列。要扩展员工示例,您的员工表将变为:

create table employees (
   id number
 , name varchar2(4000)
 , skill_1 number
 , skill_2 number
 , constraint employee_pk primary key (id)
 , constraint employee_skill_1_fs 
      foreign key ( skill_1 ) 
   references skills(skillid)
 , constraint employee_skill_2_fs 
      foreign key ( skill_2 ) 
   references skills(skillid) 
   );
正如你所见,这不是一件特别漂亮的事情,打破了正常化;如果您希望您的员工(或者您的员工当然希望)具备3项技能,会发生什么情况?还是10

最好创建第三个表,并通过单个主键和外键进行所有连接;所以你会

employees ( employee_id, ..., pk employee_id);
employee_skills ( employee_id, skill_id, ..., pk employee_id, skill_id, fk skill_id );
skills ( skill_id, description, ..., pk skill_id );

如果要在父表中创建复合主键,则需要在子表中创建复合外键。换句话说,如果希望父表使用由三个不同列组成的自然主键

CREATE TABLE car_type (
  make  VARCHAR2(100),
  model VARCHAR2(100),
  year  NUMBER,
  PRIMARY KEY pk_car_type( make, model, year )
);
然后子表也需要包含所有三列

CREATE TABLE car (
  vin   VARCHAR2(17) PRIMARY KEY,
  make  VARCHAR2(100),
  model VARCHAR2(100),
  year  NUMBER,
  FOREIGN KEY fk_car_car_type( make, model, year )
    REFERENCES car_type( make, model, year )
);
在外键定义中使用多列通常会让人感到痛苦,因为模式越来越大,您需要将更多的表连接在一起,这就是人们引入合成主键(即由序列填充的无意义键)的原因。这可以让你简化事情

CREATE TABLE car_type (
  car_type_id NUMBER PRIMARY KEY,
  make        VARCHAR2(100),
  model       VARCHAR2(100),
  year        NUMBER,
  UNIQUE uk_car_type( make, model, year )
);

CREATE TABLE car (
  vin   VARCHAR2(17) PRIMARY KEY,
  car_type_id NUMBER REFERENCES car_type( car_type_id )
);
如果
(movie,cast)
是父表的主键,则任何引用表都必须在外键中包含这两列。这只是规则

有两种方法可以解决这个问题。要么主键错误,在这种情况下,需要修改MOVIES表上的约束。或者,您需要将CAST列添加到奖励表中


当涉及到外键时,复合键是一个棘手的问题。这就是为什么许多实践者喜欢使用代理(或合成)主键,这样子表只需引用单个列。原始-复合-密钥仍然是强制的,但作为唯一密钥

为什么电影的主键中有
Cast
?我是否需要使用外键约束来指定员工技能(员工id、技能id、…、主键员工id、技能id)@typedef1,抱歉是的,我忘了fk;employee_skills将有一个employee_id的pk、skill_id和skill_id的fk转换成skills。我想它也会有employee_id作为fk?