代码之家  ›  专栏  ›  技术社区  ›  J.W.

检查SQL中的行是否已更新的最佳方法

  •  7
  • J.W.  · 技术社区  · 16 年前

    我有一个更新表的update语句。还有一列记录了上次修改的时间。如果特定行中的数据尚未更改,我不想更改上次修改的日期时间。

    检查update语句是否会更改数据行的最佳方法是什么。

    谢谢

    8 回复  |  直到 9 年前
        1
  •  9
  •   Seb    16 年前

    检查代码中的新旧数据,而不是在查询中进行检查。

    如果数据根本没有改变,就不需要不必要地打扰数据库层。

        2
  •  2
  •   Seb    16 年前

    一种方法是启动事务,选择行的内容,并将其与要更新的内容进行比较。如果它们不匹配,则执行更新并结束事务。如果它们匹配,则回滚事务。

        3
  •  2
  •   BradC    16 年前

    听起来您正在浏览一个表并修改一些行,然后您希望再次浏览该表并更新刚刚更改的行的时间戳。

    UPDATE myTable
    SET retailprice = wholesaleprice * 1.10,
        lastmodified = GetDate()
    WHERE ...
    

    或者对所有行都发出update语句,但对于大多数行,它只是将其设置为已有的值?不要那样做。排除那些不会在where子句中修改的行:

    UPDATE myTable
    SET retailprice = wholesaleprice * 1.10,
        lastmodified = GetDate()
    WHERE retailprice <> wholesaleprice * 1.10
    
        4
  •  1
  •   casperOne    16 年前

    如果您想先发制人地执行此操作,我能想到的唯一方法是修改update语句的WHERE子句,以比较现有值和新值(对于每个值)。如果 任何

        5
  •  1
  •   Otávio Décio    16 年前

        6
  •  1
  •   James Piggot    16 年前

    这取决于您是否控制数据。Seb上面的说法是正确的,在进行更新之前,您应该对照新数据检查旧数据。但是如果数据不在您的控制之下呢?

    假设您是一个被要求进行更新的Web服务。然后检查的唯一方法是查询现有数据并将其与新数据进行比较。

    不知道有任何SQL功能可以检测更新是否实际更改了任何数据。

    SQL中有很多方法可以检测update语句中包含了多少行。我不知道如何检测update语句是否确实更改了任何数据,知道这一点很有意思。

        7
  •  1
  •   IsmailS    13 年前

    如果您使用的是sql 2005/2008,则可以在存储过程中执行以下操作。

    update  newTable 
    set     readKey='1'
    output  inserted.id,
            inserted.readKey as readKey,
            deleted.readKey as prevReadKey
    into @tempTable
    where id = '1111'
    

    然后,您可以从@TENTABLE中进行选择,以验证prevReadKey和readKey是否具有相似的值。如果两者具有相似的值,您可以重置上次修改的日期时间。

    这样,当一个值实际发生变化时,您就不必对表发出多个查询。但是,如果值不变,则会触发两个update语句,其中不需要任何update语句。如果这些病例很少见,这应该没问题。

    reference of OUTPUT Clause

        8
  •  0
  •   Rob Schripsema    16 年前

    从机器的角度来看,它不是特别有效,但是您可以编写一次,并且无论哪个应用程序、存储过程或其他进程试图更新记录,它都可以处理这种情况。