我想确保我没有在表中插入重复的行(例如,仅主键不同)。我所有的字段都允许使用NULLS,因为我将null表示为“所有值”。由于为空,因此我的存储过程中的以下语句不起作用:
IF EXISTS(SELECT * FROM MY_TABLE WHERE MY_FIELD1 = @IN_MY_FIELD1 AND MY_FIELD2 = @IN_MY_FIELD2 AND MY_FIELD3 = @IN_MY_FIELD3 AND MY_FIELD4 = @IN_MY_FIELD4 AND MY_FIELD5 = @IN_MY_FIELD5 AND MY_FIELD6 = @IN_MY_FIELD6) BEGIN goto on_duplicate END
因为NULL = NULL不为真。
如何在没有每一列都具有IF IS NULL语句的情况下检查重复项?
使用INTERSECT运算符。
INTERSECT
NULL如果您在所有字段上都有一个复合索引,则它是敏感且高效的:
NULL
IF EXISTS ( SELECT MY_FIELD1, MY_FIELD2, MY_FIELD3, MY_FIELD4, MY_FIELD5, MY_FIELD6 FROM MY_TABLE INTERSECT SELECT @IN_MY_FIELD1, @IN_MY_FIELD2, @IN_MY_FIELD3, @IN_MY_FIELD4, @IN_MY_FIELD5, @IN_MY_FIELD6 ) BEGIN goto on_duplicate END
请注意,如果您UNIQUE在字段上创建索引,您的生活将变得更加简单。
UNIQUE