Dans SQL Server, j'ai cette erreur ->
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.
Je ne comprends pas pourquoi dint fonctionne key étrangère, sans leur table créée sans problèmes, mais j'ai besoin d'une relation entre les tables, à cet endroit.J'ai regardé d'autres questions similaires, mais les réponses n'ont pas été trouvées.
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, );
Désolé pour mon mauvais anglais.
Ce que tu veux c'est ça, j'en suis sûr:
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 );
C'est-à-dire que vous pouvez insert librement dans Tags
ou Posts
sans tenir count des autres tables ou données qui s'y trouvent. Une fois qu'il y a une ligne dans Posts
, vous pouvez commencer à append des lignes aux Comments
, à condition que la colonne PostId
contienne une valeur qui existe déjà dans la colonne Id
la table Posts
( Comments
references Posts
)
En outre , une fois qu'il y a des lignes dans Posts
et Tags
, vous pouvez seulement insert des lignes dans PostTags
, avec à nouveau des contraintes sur les valeurs valides dans cette table basées sur les lignes actuelles dans Posts
et Tags
.
Enfin, j'ai laissé vos options CASCADE
comme dans votre original. Si quelqu'un supprime une ligne de Posts
toutes les lignes des Comments
associés à ce message sont supprimées. De même, toutes les lignes dans PostsTags
qui se rapportent à la publication sont supprimées. Si quelqu'un supprime une ligne de Tags
alors toutes les lignes de PostsTags
qui font reference à cette balise sont supprimées.