我有一张桌子,桌子上有很多自我关系。所以我有这两个表。
TableA
{
IDTableA;
Data;
}
Realtionships
{
IDTableA;
IDTableARelated;
}
我现在想知道,对于TableA中的一行,TableA中的哪些行与此行相关。
我有两个选择,仅向Relationsips表添加一行,例如(1,2),在这种情况下2与1相关,但是2与1的关系如何,1也与2的关系。但这存在如何避免重复的问题。例如,如果一个程序要添加(1,2),而另一个程序要添加(2,1),那么如何避免重复?
第二个选择是始终添加两行(1,2)和(2,1)。但是我不确定如何确保始终保持两行。我在想这两个查询:
Begin tran
insert into Relations(IDTableA, IDTableARelated) VALUES(1,2);
insert into Relations(IDTableA, IDTableARelated) VALUES(2,1);
commint
Begin tran
delete TableAB where IDTableA = 1 and IDTableARelated = 2;
delete TableAB where IDTableA = 2 and IDTableARelated = 1;
commit
但是在测试中,我可以得到结果,其中最后只有一行。例如,如果行(1,2)存在,则可能会发生以下情况:
最终结果是我只有行(2,1),所以没有连贯性,我也应该有行(1,2)。
就我而言,我确实可以选择选项一或选项二,但是我想知道tsql是否可以通过某种方式来确保数据的一致性(如果是选项1),以避免重复,如果可以的话是第二种解决方案,请确保始终有两行。
谢谢。
编辑:我添加数据库的脚本:
USE [TestRelacionN-N]
GO
/****** Object: Table [dbo].[TablaA] Script Date: 26/05/2019 11:07:52 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[TablaA](
[IDTablaA] [bigint] IDENTITY(1,1) NOT NULL,
[Dato] [varchar](50) NULL,
CONSTRAINT [PK_TablaA] PRIMARY KEY CLUSTERED
(
[IDTablaA] 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
/****** Object: Table [dbo].[TableAWithTableA] Script Date: 26/05/2019 11:07:52 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[TableAWithTableA](
[IDTableA] [bigint] NOT NULL,
[IDTableARelated] [bigint] NOT NULL,
CONSTRAINT [PK_TableAWithTableA] PRIMARY KEY CLUSTERED
(
[IDTableA] ASC,
[IDTableARelated] 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
SET IDENTITY_INSERT [dbo].[TablaA] ON
INSERT [dbo].[TablaA] ([IDTablaA], [Dato]) VALUES (1, N'Dato01')
INSERT [dbo].[TablaA] ([IDTablaA], [Dato]) VALUES (2, N'Dato02')
INSERT [dbo].[TablaA] ([IDTablaA], [Dato]) VALUES (3, N'Dato03')
SET IDENTITY_INSERT [dbo].[TablaA] OFF
INSERT [dbo].[TableAWithTableA] ([IDTableA], [IDTableARelated]) VALUES (1, 2)