0

INSERTの前にレコードの一意性をチェックする場合の違いをよりよく理解したいと思います。CHECKSUM (一意の制約あり)を使用する場合と、以下のような自己参照テーブルステートメントを使用する場合の違いです。どのシナリオが、一方のオプションが他方よりも最良の選択となるのでしょうか。また、その理由は何ですか。

要件:列の各セットは、テーブル内のすべてのレコードから一意である必要があります。そのため、このステートメントをまとめました。データベースへの1回の呼び出しですべての列をチェックします。

INSERT INTO tblTable
(Column1, Column2, Column3, Column4, Column5, Column6) 
SELECT 
@Column1, @Column2, @Column3, @Column4, @Column5, @Column6 
WHERE NOT EXISTS 
    (SELECT DISTINCT 
        t1.Column1, 
        t1.Column2,  
            t2.Column3, 
            t2.Column4, 
                t3.Column5, 
                t3.Column6 
    FROM tblTable t1 
        JOIN tblTable t2 ON (t1.UID = t2.UID)
        JOIN tblTable t3 ON (t1.UID = t3.UID)
    WHERE
        t1.Column1 = @Column1 and 
        t1.Column2 = @Column2 and 
            t2.Column3 = @Column3 and 
            t2.Column4 = @Column4 and 
                t3.Column5 = @Column5 and 
                t3.Column6 = @Column6)
4

2 に答える 2

1

Unique 制約を使用すると、挿入方法 (クエリ エディターから手動で、ストアド プロシージャを介して、ORM ツールまたはその他の抽象化レイヤーを介して) に関係なく、制約されたデータが一意であることが保証されます。原則に違反していないことを、作成するすべてのクエリでチェックすることを覚えている開発者に依存していません。また、クエリの複雑さが軽減され、読みやすくなります。間違いの可能性はありません。

于 2009-07-30T19:46:32.813 に答える
1

この NOT EXISTS 句以上のものが必要になるのはなぜですか?

NOT EXISTS 
    (SELECT *
    FROM tblTable t1 
    WHERE
        t1.Column1 = @Column1 and 
        t1.Column2 = @Column2)

真剣に。

私はそれを考えたことはありません...しかし、自己結合は、複数の行に対する一意のチェックを意味します(または行のグループに対して一意ですか?または親/子行に対して一意ですか?)。これは、一意の行の概念を無効にします...

編集、2回目の読み取りで

標準の一意の制約を使用するだけです。

とにかく一意性を保証しないCHECKSUMは必要ありません。

ただし、チェックサムが変更されない可能性がわずかにあります。このため、アプリケーションが時折変更を見逃すことを許容できない限り、CHECKSUM を使用して値が変更されたかどうかを検出することはお勧めしません。

于 2009-07-30T19:55:06.650 に答える