У меня есть таблица со многими личными отношениями. Итак, у меня есть эти две таблицы.
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)