sql - 在SQL Server中插入多对多表

标签 sql sql-server

这是我的标签表:

CREATE TABLE [dbo].[Tag](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](max) NULL,
    [CreationDate] [datetime] NOT NULL,
    [TagSlug] [nvarchar](max) NOT NULL,

    PRIMARY KEY CLUSTERED ([Id] ASC)
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

这是我的Post 表:

CREATE TABLE [dbo].[Post](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Title] [nvarchar](400) NOT NULL,
    [Body] [nvarchar](max) NOT NULL,
    [Summary] [nvarchar](max) NOT NULL,
    [CreationDate] [datetime] NOT NULL,
    [UrlSlug] [nvarchar](max) NOT NULL,
    [Picture] [nvarchar](max) NULL,
    [TagId] [int] NOT NULL,

    PRIMARY KEY CLUSTERED ([Id] ASC)
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

ALTER TABLE [dbo].[Post]  WITH CHECK ADD  CONSTRAINT [Post_Tag] FOREIGN KEY([TagId])
REFERENCES [dbo].[Tag] ([Id])
ON DELETE CASCADE
GO

ALTER TABLE [dbo].[Post] CHECK CONSTRAINT [Post_Tag]
GO

我只想将 Tag 中的 IdPost 中的 PostId 插入到名为 Post_Tag 这是一个多对多关系,这是我的 Post_Tag 表的脚本:

CREATE TABLE [dbo].[Post_Tag](
    [PostId] [int] NOT NULL,
    [TagId] [int] NOT NULL,

    CONSTRAINT [PK_dbo.Post_Tag] PRIMARY KEY CLUSTERED ([PostId] ASC, [TagId] ASC)
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Post_Tag]  WITH CHECK 
ADD CONSTRAINT [FK_dbo.Post_Tag_dbo.Post_PostId] 
FOREIGN KEY([PostId]) REFERENCES [dbo].[Post] ([Id])
   ON DELETE CASCADE
GO

ALTER TABLE [dbo].[Post_Tag] CHECK CONSTRAINT [FK_dbo.Post_Tag_dbo.Post_PostId]
GO

ALTER TABLE [dbo].[Post_Tag] WITH CHECK 
ADD CONSTRAINT [FK_dbo.Post_Tag_dbo.Tag_TagId] 
FOREIGN KEY([TagId]) REFERENCES [dbo].[Tag] ([Id])
   ON DELETE CASCADE
GO

ALTER TABLE [dbo].[Post_Tag] CHECK CONSTRAINT [FK_dbo.Post_Tag_dbo.Tag_TagId]
GO

现在,为此我尝试了以下查询:

insert into [Blog].[dbo].[Post_Tag] (PostId,TagId)
   select [Id] as [PostId] from [OldBlog].[dbo].[Tag]
   select [TagId] from [OldBlog].[dbo].[Post]

但运行脚本时出现此错误:

The select list for the INSERT statement contains fewer items than the insert list. The number of SELECT values must match the number of INSERT columns.

我的查询有什么问题吗?谢谢

最佳答案

这 2 个选择查询正在单独处理。您必须想出一种方法将 [OldBlog].[dbo].[Tag] 加入 [OldBlog].[dbo].[Post] 以便您可以将字段 PostId,TagId 从这个新表表达式插入到 [Blog].[dbo].[Post_Tag] 中。

关于sql - 在SQL Server中插入多对多表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23942953/

相关文章:

mysql - SQL命令返回用户大于阈值

sql-server - 如果表存在,如何删除它?

c# - 在 SQL Server 中存储图像的最佳方式

sql - 索引减少读取的行数;无性能增益

sql - SQL Server 2012 中的 XML 与 JSON

sql - 在 WHERE 子句中使用自定义函数加速更新

mysql - COUNT(*) 是否总是返回结果?

python - 如何将查询结果映射到 sqlalchemy 中的自定义对象?

SQL 递归 CTE 链接链

SQL Server 日期时间 where 子句