【问题标题】:How to execute an UPDATE only if one row would be affected?仅当一行受到影响时如何执行更新?
【发布时间】:2013-02-01 16:00:27
【问题描述】:

我在 SQL Server 中有一个表,它有一个 PK (ID) 和另一个由其他几列组成的(逻辑)主键(尽管没有 UNIQUE 约束)。比方说,表PERSONPK = PERSON_ID,然后是NAMESURNAMEAGE

我希望可以说

UPDATE PERSON SET AGE = 43 WHERE NAME = 'XX' AND SURNAME = 'YYY'

只有在'updated rows' = 1 时才执行,否则(超过 1 行)根本不执行。问题是我不确定 NAME 和 SURNAME 是否唯一标识一条记录,而且我无法先验地告诉它。

想法?

【问题讨论】:

标签: sql-server tsql


【解决方案1】:

试试下面的查询...它会帮助你

UPDATE PERSON 
SET AGE = 43 
WHERE NAME = 'XX' 
  AND SURNAME = 'YYY' 
  AND 1 = (SELECT COUNT(*) FROM PERSON WHERE NAME = 'XX' AND SURNAME = 'YYY)

【讨论】:

  • 我选择这个是因为它是最短的:)。谢谢大家。
【解决方案2】:

我会将条件放在更新之前,而不是放在 where 子句中。

IF (SELECT COUNT(*) FROM PERSON WHERE NAME = 'XX' AND SURNAME = 'YYY') = 1
UPDATE PERSON SET AGE = 43 WHERE NAME = 'XX' AND SURNAME = 'YYY'

【讨论】:

    【解决方案3】:

    我通常不会编写复杂的 WHERE 子句或 IF 语句,而是将整个事情包装在一个事务中并检查@@ROWCOUNT:

    BEGIN TRAN
    UPDATE PERSON SET AGE = 43 WHERE NAME = 'XX' AND SURNAME = 'YYY'
    IF @@ROWCOUNT > 1 ROLLBACK TRAN ELSE COMMIT TRAN
    

    【讨论】:

      【解决方案4】:

      应该这样做。

      UPDATE Person p1
      SET p1.AGE = 43
      WHERE NAME = 'XX' AND SURNAME = 'YY'
      AND NOT EXISTS (
        SELECT NULL FROM Person p2
        WHERE p1.NAME = p2.NAME
        AND p1.SURNAME = p2.SURNAME
        GROUP BY p2.NAME, p2.SURNAME
        HAVING COUNT(*) > 1)
      

      【讨论】:

        【解决方案5】:
        UPDATE Person p1
        SET p1.AGE = 43
        WHERE NAME = 'XX' AND SURNAME = 'YY'
        AND NOT EXISTS (
          SELECT NULL FROM Person p2
          WHERE p1.NAME = p2.NAME
          AND p1.SURNAME = p2.SURNAME
          AND p1.ID <> p2.ID)
        

        【讨论】:

          猜你喜欢
          • 2019-11-20
          • 2011-06-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-26
          相关资源
          最近更新 更多