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?