如果一行受到影响,如何执行UPDATE?

Die*_*tto 2 t-sql sql-server

我在SQL Server中有一个表,其中有一个PK(ID)和另一个(逻辑)主键由其他几列(尽管没有UNIQUE约束).比方说,表PERSON,PK = PERSON_ID,然后NAME,SURNAME,AGE

我想有可能说

UPDATE PERSON SET AGE = 43 WHERE NAME = 'XX' AND SURNAME = 'YYY'
Run Code Online (Sandbox Code Playgroud)

并且只有在'updated rows'= 1时执行它,否则(超过1行)执行完全没有执行.问题是我不确定NAME和SURNAME是否唯一地标识了一条记录,我无法先验地说出来.

想法?

duc*_*nny 6

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

BEGIN TRAN
UPDATE PERSON SET AGE = 43 WHERE NAME = 'XX' AND SURNAME = 'YYY'
IF @@ROWCOUNT > 1 ROLLBACK TRAN ELSE COMMIT TRAN
Run Code Online (Sandbox Code Playgroud)


Pan*_*ian 5

尝试以下查询......它会对您有所帮助

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


小智 5

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

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


Rap*_*aus 1

类似的事情应该可以做到。

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)
Run Code Online (Sandbox Code Playgroud)