在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,
);
抱歉英语不好。
答案 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
);
即 - 您可以自由地插入Tags
或Posts
而不考虑其中的任何其他表格或数据。 一旦 Posts
中有一行,您就可以开始向Comments
添加行,提供,PostId
列包含一个值已存在于Posts
表的Id
列中(Comments
引用 Posts
)
进一步,一旦Posts
和Tags
中都有行,只有这样才能将行插入PostTags
,再次限制哪些值是在该表中有效基于Posts
和Tags
中的当前行。
最后,我已将您的CASCADE
选项设置为原始版本。如果有人从Posts
删除了一行,那么Comments
中与该帖子相关的所有行都将被删除。同样,PostsTags
中与帖子相关的所有行都将被删除。如果有人从Tags
删除了一行,那么PostsTags
中引用该标记的所有行都将被删除。