【发布时间】:2020-08-15 16:42:29
【问题描述】:
我有以下表格:
✓CREATE TABLE [dbo].[articles]( [ID] [int] IDENTITY(1,1) NOT NULL, [name] [nvarchar](200) NOT NULL, CONSTRAINT [PK_articles] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO
CREATE TABLE [dbo].[test_users]( [ID] [int] IDENTITY(1,1) NOT NULL, [GUID] [nvarchar](100) NOT NULL, CONSTRAINT [PK_test_users] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY], CONSTRAINT [unique_guid] UNIQUE NONCLUSTERED ( [GUID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]
✓GO
✓CREATE TABLE [dbo].[relational]( [ID] [int] IDENTITY(1,1) NOT NULL, [articleid] [int] NOT NULL, [userguid] [nvarchar](100) NOT NULL, CONSTRAINT [PK_relational] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] ALTER TABLE [dbo].[relational] WITH CHECK ADD CONSTRAINT [FK_relational_articles] FOREIGN KEY([articleid]) REFERENCES [dbo].[articles] ([ID]) ALTER TABLE [dbo].[relational] CHECK CONSTRAINT [FK_relational_articles] ALTER TABLE [dbo].[relational] WITH CHECK ADD CONSTRAINT [FK_relational_relational] FOREIGN KEY([userguid]) REFERENCES [dbo].[test_users] ([GUID]) ALTER TABLE [dbo].[relational] CHECK CONSTRAINT [FK_relational_relational] GO
CREATE TABLE [dbo].[seperated]( [ID] [int] IDENTITY(1,1) NOT NULL, [userguid] [nvarchar](100) NOT NULL, [articles] [nvarchar](max) NOT NULL, CONSTRAINT [PK_seperated] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] ALTER TABLE [dbo].[seperated] WITH CHECK ADD CONSTRAINT [FK_seperated_test_users] FOREIGN KEY([userguid]) REFERENCES [dbo].[test_users] ([GUID]) ALTER TABLE [dbo].[seperated] CHECK CONSTRAINT [FK_seperated_test_users]
✓GO
SET IDENTITY_INSERT [dbo].[test_users] ON INSERT [dbo].[test_users] ([ID], [GUID]) VALUES (1, N'guid1') INSERT [dbo].[test_users] ([ID], [GUID]) VALUES (2, N'guid2') INSERT [dbo].[test_users] ([ID], [GUID]) VALUES (3, N'guid3') INSERT [dbo].[test_users] ([ID], [GUID]) VALUES (4, N'guid4') SET IDENTITY_INSERT [dbo].[test_users] OFF GO
4 行受影响
身份证 |图形用户界面 -: | :---- 1 |指导1 2 |引导2 3 |引导3 4 |指导4SELECT * FROM [dbo].[test_users] GO
SET IDENTITY_INSERT [dbo].[articles] ON INSERT [dbo].[articles] ([ID], [name]) VALUES (1, N'article1') INSERT [dbo].[articles] ([ID], [name]) VALUES (2, N'article2') INSERT [dbo].[articles] ([ID], [name]) VALUES (3, N'article3') SET IDENTITY_INSERT [dbo].[articles] OFF GO
3 行受影响
身份证 |姓名 -: | :-------- 1 |第1条 2 |第2条 3 |第3条SELECT * FROM [dbo].[articles] GO
SET IDENTITY_INSERT [dbo].[relational] ON INSERT [dbo].[relational] ([ID], [articleid], [userguid]) VALUES (1, 1, N'guid1') INSERT [dbo].[relational] ([ID], [articleid], [userguid]) VALUES (2, 1, N'guid2') INSERT [dbo].[relational] ([ID], [articleid], [userguid]) VALUES (3, 2, N'guid2') INSERT [dbo].[relational] ([ID], [articleid], [userguid]) VALUES (4, 1, N'guid3') INSERT [dbo].[relational] ([ID], [articleid], [userguid]) VALUES (5, 3, N'guid3') SET IDENTITY_INSERT [dbo].[relational] OFF GO
5 行受影响
身份证 |文章ID |用户指南 -: | --------: | :-------- 1 | 1 |指导1 2 | 1 |引导2 3 | 2 |引导2 4 | 1 |引导3 5 | 3 |引导3SELECT * FROM [dbo].[relational] GO
SET IDENTITY_INSERT [dbo].[seperated] ON INSERT [dbo].[seperated] ([ID], [userguid], [articles]) VALUES (1, N'guid1', N'1') INSERT [dbo].[seperated] ([ID], [userguid], [articles]) VALUES (3, N'guid2', N'1,2') INSERT [dbo].[seperated] ([ID], [userguid], [articles]) VALUES (4, N'guid3', N'1,3') INSERT [dbo].[seperated] ([ID], [userguid], [articles]) VALUES (5, N'guid4', N'') SET IDENTITY_INSERT [dbo].[seperated] OFF GO
4 行受影响
身份证 |用户指南 |文章 -: | :------- | :-------- 1 |指导1 | 1 3 |指导2 | 1,2 4 |引导3 | 1,3 5 |指导4 |SELECT * FROM [dbo].[seperated] GO
db小提琴here
在文章表上有插入、删除和更新的触发器。
- 插入后,在关系表中创建记录(仅适用于新文章)
- 删除后,关系表中的记录被删除(仅适用于删除文章)
- 更新后,会创建/删除记录(仅适用于更新的文章)
之后需要更新分隔表。
对于每个用户,必须恰好有 1 条记录,文章以逗号分隔(基本上是 user.guid,SELECT * FROM 关系式 WHERE userguid = user.guid)
在每次插入/删除/更新之后,使用 XML FOR PATH 完全更新分隔表。
然而这不再是一个可行的选择,因为这个操作不够快(关系表中有大约 5 - 1000 万条记录)
要解决此问题,我想仅为新/更新/删除的文章更新分隔表:
在触发器中,我用@articleId 声明了articleid。
插入时:添加 ',articleId' 或添加 '@articleId' 如果该行为空(不能为空)
删除时:从所有行中删除 articleId
更新时:在需要时删除并在需要时添加(取决于在关系表中找到的内容)
因为我基本上从不使用逗号分隔的东西,所以我不知道该怎么做。
任何帮助将不胜感激:)
注意事项:
- 不,我不能在应用程序中执行此操作,因为创建文章记录的应用程序无法连接到数据库(它使用了一些晦涩的 API),而且由于网络原因也无法连接。
- 插入、更新和删除的数量非常少(因此我们可以在触发器中执行此操作)
- 我必须使用逗号分隔的结构,我无法更改模型,因为在此数据库之上运行的应用程序是第 3 方应用程序,我们无法更改,也无法要求修改...李>
- 是的,这些表已缩小,并非所有列都在这里,因为它们对这个问题无关紧要
【问题讨论】:
-
在逗号分隔的字符串中存储多个值是构建数据的错误方式。修复您的数据模型。
-
"你成为了一个经典错误的牺牲品,其中最著名的是“永远不要卷入亚洲的陆战”,但鲜为人知的是:“永远不要使用逗号” - 在一列中分隔数据! "
-
为什么你的表只有一列,这是一个标识?抛开模型的问题(你现在可能没有能力改变它,我去过那里),你能分享一些示例数据和预期效果吗?
标签: sql sql-server csv tsql