0

我想更好地理解使用CHECKSUM(具有唯一约束)自引用表语句(如下所示)在插入之前检查记录中唯一性的区别。什么样的情况会使一种选择成为优于另一种的最佳选择,以及出于什么原因?

要求:每组列都需要在表中的每条记录中都是唯一的,这就是我把这个语句放在一起的原因;在一次调用数据库中检查所有列。

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

使用唯一约束将保证受约束的数据是唯一的,无论它是如何插入的(从查询编辑器手动插入,通过存储过程,通过 ORM 工具或任何其他抽象层)。它不依赖于开发人员记住检查他们编写的每个查询是否违反了原则。它还使您的查询不那么复杂且易于阅读。没有出错的机会。

于 2009-07-30T19:46:32.813 回答
1

为什么您需要的不仅仅是这个 NOT EXISTS 子句?

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

严重地。

我从来没有想过……但是自联接意味着对不止一行的唯一检查(或对一组行唯一的检查?或对父/子行的唯一检查?)。这将使独特的行概念无效......

编辑,二读

只需使用标准的唯一约束

不需要CHECKSUM,它无论如何都不能保证唯一性。

但是,校验和不会改变的可能性很小。因此,我们不建议使用 CHECKSUM 来检测值是否已更改,除非您的应用程序可以容忍偶尔丢失更改

于 2009-07-30T19:55:06.650 回答