【问题标题】:Table contains no primary or candidate keys that match the referencing column list in the foreign key表不包含与外键中的引用列列表匹配的主键或候选键
【发布时间】:2020-04-16 00:16:56
【问题描述】:

这是我的第一张桌子:

CREATE TABLE [dbo].[County] 
(
    [CountyId] INT         IDENTITY (1, 1) NOT NULL,
    [County]   VARCHAR(50) NOT NULL,
    CONSTRAINT [PK_County] PRIMARY KEY CLUSTERED ([CountyId] ASC)
);

这是我的第二张桌子:

CREATE TABLE [dbo].[Theatre] 
(
    [TheatreId]   INT         IDENTITY (1, 1) NOT NULL,
    [TheatreName] VARCHAR(50) NOT NULL,
    [CountyId]    INT         NOT NULL,

    CONSTRAINT [PK_Theatre] 
        PRIMARY KEY CLUSTERED ([TheatreId] ASC),
    CONSTRAINT [FK_Theatre_County] 
        FOREIGN KEY ([CountyId]) REFERENCES [dbo].[County] ([CountyId])
);

这是我的第三张桌子:

CREATE TABLE [dbo].[Movies] 
(
    [CinemaId]    INT         NOT NULL,
    [CategoryId]  INT         NOT NULL IDENTITY(101, 1),
    [CinemaName]  VARCHAR(50) NOT NULL,
    [TheatreId]   INT         NOT NULL,
    [ShowTimings] TIME (7)    NOT NULL,

    CONSTRAINT [PK_Movies] 
        PRIMARY KEY CLUSTERED ([CinemaId], [CategoryId]),
    CONSTRAINT [FK_Movies_Theatre] 
        FOREIGN KEY ([TheatreId]) REFERENCES [dbo].[Theatre] ([TheatreId])
);

这是我最后一张桌子:

CREATE TABLE [dbo].[Reviews]
(
    [MovieId]          INT         IDENTITY (1, 1) NOT NULL,
    [Name]             VARCHAR(50) NOT NULL,
    [Genres]           VARCHAR(50) NOT NULL,
    [Image]            VARCHAR(50) NOT NULL,
    [ShortDescription] TEXT        NOT NULL,
    [Rating]           VARCHAR(50) NOT NULL,
    [Grade]            VARCHAR(50) NOT NULL,
    [CategoryId]       INT         NOT NULL,

    CONSTRAINT [PK_Reviews] 
        PRIMARY KEY CLUSTERED ([MovieId] ASC), 
    CONSTRAINT [FK_Reviews_Movies] 
        FOREIGN KEY ([CategoryId]) REFERENCES [Movies]([CategoryId]),   
);

我已在表之间创建了关系,但在更新最后一个表时出现错误:

SQL71516 :: 引用的表 '[dbo].[Movies]' 不包含与外键中的引用列列表匹配的主键或候选键。如果引用的列是计算列,它应该被持久化。

请告诉我我做错了什么?

【问题讨论】:

  • ntexttext 数据类型将在 SQL Server 的未来版本中删除。避免在新的开发工作中使用这些数据类型,并计划修改当前使用它们的应用程序。请改用nvarchar(max)varchar(max)See details here
  • 按照您的设置方式,每部电影最多可以有一次评论 - 因为您使用MovieId 作为@987654331 的主键@table - 这就是你想要的吗??
  • 而且您将无法控制与评论相关联的电影,因为这是一个身份,因此通常由系统生成
  • @Martin Smith-是的,我正在使用复合主键,因为第二个键是 MovieId 正在与其他表的关系中使用,并且我将 CategoryId 保留为身份,因为它在关系中使用带有评论表。
  • @Martin Smith- 你认为使用复合主键是本案的问题吗?

标签: sql-server foreign-keys


【解决方案1】:

正如错误所说,Movies.CategoryId 不是键,因此您不能在外键中引用它。您需要一个以 CategoryId 作为主键的 Categories 表。然后评论和电影都可以有一个外键引用类别。

【讨论】:

  • Browne-CategoryId 被设置为电影表中的主键
  • @HarshDesai 不,不是。 Movies 的主键是 TWO 的组合键。要创建外键,必须引用另一张表的完整主键(或唯一约束)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-25
  • 1970-01-01
  • 2013-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多