sql >> データベース >  >> RDS >> Sqlserver

存在しない場所に値を挿入

    IFを使用してこれを行うことができます ステートメント:

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

    IFなしでそれを行うことができます SELECTを使用する

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

    どちらの方法も競合状態の影響を受けやすいため、上記のいずれかを使用して挿入しますが、一意の制約を使用して重複する挿入を保護できます。

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

    SQL-Fiddleの例

    補遺

    SQL Server 2008以降では、MERGEを使用できます。 HOLDLOCKを使用 競合状態の可能性を排除するため(これはまだ一意の制約の代わりにはなりません)。

    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);
    

    SQLフィドルでのマージの例



    1. サブクエリのパフォーマンスが低いPostgreSQLIN演算子

    2. 12cシーケンス値を使用した列の自動入力

    3. 2つのMySQLテーブルをマージするにはどうすればよいですか?

    4. MySQLトリガーが機能しない、単純な構文、複雑ではない