我在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是否唯一地标识了一条记录,我无法先验地说出来.
想法?
我通常不会编写复杂的 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)
尝试以下查询......它会对您有所帮助
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)
类似的事情应该可以做到。
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)
| 归档时间: |
|
| 查看次数: |
4809 次 |
| 最近记录: |