如何在多对多自我关系表中添加行并保持连贯性?

时间:2019-05-26 08:28:54

标签: sql-server sql-server-2012

我有一张桌子,桌子上有很多自我关系。所以我有这两个表。

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)存在,则可能会发生以下情况:

  • 第一个过程尝试添加(1,2)行。
  • 第二个过程尝试删除(2,1)行;
  • 第一个过程尝试添加(2,1);
  • 第二个过程尝试删除(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)

0 个答案:

没有答案