2015-12-26 45 views
0

我目前得到像这样的一个表:如何创建引用另一个由多个外键组成的主键的外键?

create table NetWorth (
    id int, 
    id_movie int foreign key references Movie(id), 
    primary key (id, id_movie) 
    )  

而想要做出它的主键,它是由2个属性,它自己的ID参考和电影台的ID 。目前,我在想是这样的:

create table Merchandising (
    id_networth int foreign key references NetWorth(id) primary key, 
    value float 
    ) 

但很明显这是错误的,因为它缺少第二个关键的参考,我不知道如何实现它的第二个表。那么你们可以帮我吗?

+1

如果要引用的主键由多列构成,**所有**外键引用它**还必须**具有并使用**所有这些列**。你不能只引用半个主键 - 这是全部或没有。 –

+0

“NetWorth.Id”是否是唯一的?如果是这样,为什么不把它作为主键?如果不是,则在非唯一字段上定义外键引用是没有意义的。 – sstan

+0

@marc_s这绝对是有道理的。但是什么是正确的语法?我尝试过不同的事情,但是我没有成功找到引用这两列的正确语法。 – KaiZ

回答

3

如果要引用的主键由多个列组成,则引用它的所有外键还必须具有并使用所有这些列。你不能只引用半个主键 - 这是全部或没有。

由于FK引用你的情况两列,你不能应用FOREIGN KEY约束语法为单个列 - 用这个来代替:

create table Merchandising 
(
    id_networth int 
     constraint PK_Merchandising primary key, 
    id_movie int, 
    value float, 

    constraint FK_Merchandising_Networth 
     foreign key(id, id_movie) references NetWorth(id, id_movie) 
) 

而且我也建议总是指定显式名称您的约束 - 您的主键约束,以及您的外键约束(以及您可能拥有的所有其他约束)。

+0

谢谢,我还没有测试过,但我很确定这是我需要的,它的工作原理。但是,你能解释一下这段代码的作用吗?我想了解那里发生了什么。我已经分析过它,但我很难理解它究竟做了什么。 – KaiZ

+0

@KaiZ:不确定你的意思 - '约束...'只是定义FK约束,给它一个名字,根据引用“NetWorth”表的两列的外键约束来定义它(及其两个列)..... –

0

正如你在评论中提到的,NetWorth.Id是唯一的,所以可能是唯一应该定义为主键的列,而不是id, id_movie

一旦你做了这个改变,你将不再有问题从Merchandising表创建你的外键引用。

编辑

你的表创建语句看起来是这样的(虽然我认为你应该明确地命名约束marc_s同意):

create table NetWorth (
    id int primary key, 
    id_movie int foreign key references Movie(id) 
) 

create table Merchandising (
    id_networth int foreign key references NetWorth(id) primary key, 
    value float 
) 
+0

我想我需要两者,因为我需要同时基于'Movie.Id'的NetWorth.Id的内容。实际上,净资产是以每部电影为基础的。每部电影应该有不同的净值。 – KaiZ

+0

没有'id_movie'作为主键的一部分并不能阻止同一列有一个外键引用'Movie(id)'。所以我没有看到问题。我编辑了我的答案,告诉你它可能是什么样子。 – sstan