FOREIGN KEY:不包含主键或候选键

时间:2014-01-27 12:29:51

标签: sql-server

在SQL Server中,我收到此错误 - >

  SQL71516 :: The referenced table '[dbo].[PostsTags]' contains no primary or candidate keys that match the referencing column list in the foreign key. If the referenced column
 is a computed column, it should be persisted.

我不明白为什么dint工作外键,没有它们创建表没有问题,但我需要表之间的关系,在这个位置。我看了其他类似的问题,但找不到答案。

CREATE TABLE [dbo].[PostsTags] (
    [PostId] INT NOT NULL,
    [TegId]  INT NOT NULL,
    CONSTRAINT [PK_PostsTags] PRIMARY KEY CLUSTERED ([PostId] ASC, [TegId] ASC)
);


CREATE TABLE [dbo].[Comments] (
    [Id]       INT            IDENTITY (1, 1) NOT NULL,
    [PostId]   INT            NOT NULL,
    [DateTime] DATETIME       NOT NULL,
    [Name]     NVARCHAR (64) NOT NULL,
    [Body]     NVARCHAR (MAX) NOT NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);

CREATE TABLE [dbo].[Tags] (
    [Id]   INT           IDENTITY (1, 1) NOT NULL,
    [Name] NVARCHAR (64) NOT NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC),
CONSTRAINT [FK_Tags_PostsTags] FOREIGN KEY ([Id]) REFERENCES [PostsTags]([TegId]) ON DELETE CASCADE 
);

CREATE TABLE [dbo].[Posts] (
    [Id]       INT            IDENTITY (1, 1) NOT NULL,
    [Title]    NVARCHAR (128) NOT NULL,
    [DateTime] DATETIME       NOT NULL,
    [Body]     NVARCHAR (MAX) NOT NULL,
    [Avtor]     NVARCHAR (64)  NOT NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC),
CONSTRAINT [Post_Tag] FOREIGN KEY ([Id]) REFERENCES [PostsTags]([PostId]) ON DELETE CASCADE,
CONSTRAINT [Post_Comment] FOREIGN KEY ([Id]) REFERENCES [Comments]([PostId]) ON DELETE CASCADE,
);

抱歉英语不好。

1 个答案:

答案 0 :(得分:3)

你想要的是这个,我敢肯定:

CREATE TABLE [dbo].[Tags] (
    [Id]   INT           IDENTITY (1, 1) NOT NULL,
    [Name] NVARCHAR (64) NOT NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);

CREATE TABLE [dbo].[Posts] (
    [Id]       INT            IDENTITY (1, 1) NOT NULL,
    [Title]    NVARCHAR (128) NOT NULL,
    [DateTime] DATETIME       NOT NULL,
    [Body]     NVARCHAR (MAX) NOT NULL,
    [Avtor]     NVARCHAR (64)  NOT NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);

CREATE TABLE [dbo].[PostsTags] (
    [PostId] INT NOT NULL,
    [TagId]  INT NOT NULL,
    CONSTRAINT [PK_PostsTags] PRIMARY KEY CLUSTERED
           ([PostId] ASC, [TagId] ASC),
    CONSTRAINT [FK_PostsTags_Tags] FOREIGN KEY ([TagId])
           REFERENCES [Tags]([Id]) ON DELETE CASCADE,
    CONSTRAINT [FK_PostTags_Posts] FOREIGN KEY ([PostId])
           REFERENCES [Posts]([Id]) ON DELETE CASCADE 
);

CREATE TABLE [dbo].[Comments] (
    [Id]       INT            IDENTITY (1, 1) NOT NULL,
    [PostId]   INT            NOT NULL,
    [DateTime] DATETIME       NOT NULL,
    [Name]     NVARCHAR (64) NOT NULL,
    [Body]     NVARCHAR (MAX) NOT NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [FK_Comments_Posts] FOREIGN KEY ([PostId])
          REFERENCES [Posts](Id) ON DELETE CASCADE
);

即 - 您可以自由地插入TagsPosts而不考虑其中的任何其他表格或数据。 一旦 Posts中有一行,您就可以开始向Comments添加行,提供PostId列包含一个值已存在于Posts表的Id列中(Comments 引用 Posts

进一步,一旦PostsTags中都有行,只有这样才能将行插入PostTags,再次限制哪些值是在该表中有效基于PostsTags中的当前行。

最后,我已将您的CASCADE选项设置为原始版本。如果有人从Posts删除了一行,那么Comments中与该帖子相关的所有行都将被删除。同样,PostsTags中与帖子相关的所有行都将被删除。如果有人从Tags删除了一行,那么PostsTags中引用该标记的所有行都将被删除。