INSERT VALUES WHERE NOT EXISTS

后端 未结 5 1497
我寻月下人不归
我寻月下人不归 2020-12-03 04:17

OK so I\'m trying to improve my asp data entry page to ensure that the entry going into my data table is unique.

So in this table I have SoftwareName and SoftwareTyp

5条回答
  •  囚心锁ツ
    2020-12-03 05:05

    You could do this using an IF statement:

    IF NOT EXISTS 
        (   SELECT  1
            FROM    tblSoftwareTitles 
            WHERE   Softwarename = @SoftwareName 
            AND     SoftwareSystemType = @Softwaretype
        )
        BEGIN
            INSERT tblSoftwareTitles (SoftwareName, SoftwareSystemType) 
            VALUES (@SoftwareName, @SoftwareType) 
        END;
    

    You could do it without IF using SELECT

    INSERT  tblSoftwareTitles (SoftwareName, SoftwareSystemType) 
    SELECT  @SoftwareName,@SoftwareType
    WHERE   NOT EXISTS 
            (   SELECT  1
                FROM    tblSoftwareTitles 
                WHERE   Softwarename = @SoftwareName 
                AND     SoftwareSystemType = @Softwaretype
            );
    

    Both methods are susceptible to a race condition, so while I would still use one of the above to insert, but you can safeguard duplicate inserts with a unique constraint:

    CREATE UNIQUE NONCLUSTERED INDEX UQ_tblSoftwareTitles_Softwarename_SoftwareSystemType
        ON tblSoftwareTitles (SoftwareName, SoftwareSystemType);
    

    Example on SQL-Fiddle


    ADDENDUM

    In SQL Server 2008 or later you can use MERGE with HOLDLOCK to remove the chance of a race condition (which is still not a substitute for a unique constraint).

    MERGE tblSoftwareTitles WITH (HOLDLOCK) AS t
    USING (VALUES (@SoftwareName, @SoftwareType)) AS s (SoftwareName, SoftwareSystemType) 
        ON s.Softwarename = t.SoftwareName 
        AND s.SoftwareSystemType = t.SoftwareSystemType
    WHEN NOT MATCHED BY TARGET THEN 
        INSERT (SoftwareName, SoftwareSystemType) 
        VALUES (s.SoftwareName, s.SoftwareSystemType);
    

    Example of Merge on SQL Fiddle

提交回复
热议问题