我有一個名爲dbo.mtestUnique的表,其中有兩個列id和desc,我在「desc」上有一個唯一索引,兩個進程在這個表中插入數據同一時間,我該如何避免插入重複值並違反唯一索引?SQL Server 2014-並行進程在具有唯一索引的表格中插入相同的值
不存在,左連接不起作用。
複製這個你可以測試數據庫中創建表:
CREATE TABLE mtestUnique
(
id INT ,
[DESC] varchar(50),
UNIQUE([DESC])
)
,然後在兩個不同的查詢上SSMS運行下面的腳本。
SET XACT_ABORT ON;
DECLARE @time VARCHAR(50)
WHILE (1=1)
BEGIN
IF OBJECT_ID('tempdb..#t') IS NOT NULL
DROP TABLE #t
SELECT @time = CAST(DATEPART(HOUR , GETDATE()) AS VARCHAR(10)) + ':' + RIGHT('00' +CAST(DATEPART(MINUTE , GETDATE())+1 AS VARCHAR(2)),2)
SELECT MAX(id) + 1 id , 'test' + @time [DESC]
INTO #t
FROM dbo.mtestUnique
-- to insert as exact same time
WAITFOR TIME @time
INSERT INTO dbo.mtestUnique
(id, [DESC])
SELECT *
FROM #t t
WHERE NOT EXISTS (
SELECT 1
FROM dbo.mtestUnique u
WHERE u.[DESC] = t.[Desc]
)
END
我甚至把插入一個TRAN,但沒有運氣。
感謝您的幫助提前。
您可以在ID列上使用[Identity](https://msdn.microsoft.com/en-us/library/ms186775.aspx)嗎? – SMM
它會如何幫助? – user3951476
如果你需要一個獨特的desc,那麼使其獨特,而不僅僅是時間。使用,例如NEWID()或當前session_ID +時間。 – Anton