【问题标题】:Is there a better way to check the database for a unique value that works for both update and insert then below有没有更好的方法来检查数据库的唯一值,该值适用于更新和插入然后在下面
【发布时间】:2015-08-30 23:12:47
【问题描述】:
IF EXISTS(SELECT * FROM MyTable WITH (NOLOCK) WHERE MyTable.RecordId <> @RecordId AND MyTable.UniqueColumn = @UniqueValue)
        BEGIN
            SELECT 1
        END
        ELSE
        BEGIN
            SELECT 0
        END 

注意:我使用 NOLOCK,因此它会检查待处理的插入和更新(即有人更新/更改 UniqueColumn)

注意:我使用“IF EXISTS(”,所以它会在找到第一个匹配项后停止搜索

注意:我使用“MyTable.RecordId @RecordId”,这样它就不会发现自己是匹配项。

注意:如果插入 recordId 将为负一或零。

【问题讨论】:

  • 请定义“更好”:更快?代码少?更清晰的代码?
  • 有没有更快的方法让这段代码在不丢失任何功能的情况下执行?
  • 试试 select 1 而不是 select *
  • @dman2306:这没有任何区别,因为IF EXISTS() 只检查行的存在 - 它实际上并不返回 任何数据(它返回 0 或 1,取决于行是否存在)。
  • 如果MyTable.UniqueColumn上有索引,并且@UniqueValue的数据类型与MyTable.UniqueColumn的数据类型相同,那么您的查询将执行得非常快。

标签: sql-server unique


【解决方案1】:

不知道它是否“更好”,但它更中肯:

select
  case 
    when
      exists ( select * from ... where ... )
    then 1 
    else 0 
  end as IsThereOrNot

...并且可以与其他表达式一起使用(如果您需要'em)。

注意:select * 适用于存在性检查,并且 nolock 不会改变任何东西 - select 范围内有一个隐式事务。

我认为如果您为列命名(示例中为 IsThereOrNot)会更好(消费者更容易使用结果)

【讨论】:

    猜你喜欢
    • 2011-02-20
    • 2015-02-03
    • 1970-01-01
    • 2013-12-17
    • 2020-10-31
    • 2011-07-28
    • 2016-10-28
    • 1970-01-01
    相关资源
    最近更新 更多