Как добавить строку в таблицу отношений многих ко многим и быть последовательным? - PullRequest
0 голосов
/ 26 мая 2019

У меня есть таблица со многими личными отношениями. Итак, у меня есть эти две таблицы.

TableA
{
    IDTableA;
    Data;
}

Realtionships
{
    IDTableA;
    IDTableARelated;
}

Я хотел бы знать сейчас, для строки в Таблице A, какие строки в Таблице A связаны с этой строкой.

У меня есть два варианта: добавить только одну строку в таблицу 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)
...