如果引用的列是计算列,则应该保留它

时间:2014-04-17 05:39:46

标签: mysql sql sql-server

我有一个表的收藏夹,其定义类似于

CREATE TABLE [dbo].[Favorites] (
    [username] VARCHAR (50) NOT NULL,
    [imdbId]   VARCHAR (50) NOT NULL,
    PRIMARY KEY CLUSTERED ([username] ASC, [imdbId] ASC),
    FOREIGN KEY ([username]) REFERENCES [dbo].[proj_users] ([username])
);

现在我还有一个表TopMovies

CREATE TABLE [dbo].TopMovies (
    [imdbId] VARCHAR(50) NOT NULL , 
    [count] INT NOT NULL, 
    PRIMARY KEY ([imdbId], [count]),
    CONSTRAINT [FK_TopMovies_Favorites] FOREIGN KEY ([imdbId]) REFERENCES [dbo].[Favorites] ([imdbId]) ON DELETE CASCADE

当我尝试创建此表时,出现以下错误:

“引用的表'[dbo]。[Favorites]'不包含与外键中的引用列列表匹配的主键或候选键。如果引用的列是计算列,则应该保留它。”

2 个答案:

答案 0 :(得分:0)

我认为你不能创建TopMovies的FK,因为,收藏夹的PK有2列而你只是引用1.我的意思是你有一方:

  • 复合PK的收藏夹
  • TopMovies尝试在1列复合PK上使用FK

你应该在TopMovies中有类似的东西:

FOREIGN KEY([username], [imdbId]) REFERENCES [dbo].[Favorites]([username], [imdbId])

此处您有完全相同的问题:StackOverflow foreign key composite primary key sql server

您必须在之间进行选择,将收藏夹的复合PK更改为简单PK或在FK表中添加缺少的列。

答案 1 :(得分:0)

您的架构未正确规范化。 imdb应该是一个单独的实体(表),由Favorites和TopMovies引用。

另一方面,TopMovies上的PK看起来也很可疑。