SQL Server UPDATE语句异常:同tid关联数据被误更新求助
这个问题我之前也碰到过,核心是你对表结构和UPDATE语句的作用对象理解有点偏差,我来给你理清楚:
首先看你的表结构:THEATER的tid是主键,意味着每个影院只有一条记录,而SeatsAvailable字段就存在这个表中——也就是说,这个字段是整个影院的总可用座位数,不是某个场次专属的。
当你执行这条UPDATE语句时:
UPDATE THEATER SET SeatsAvailable = SeatsAvailable - 1 FROM THEATER INNER JOIN CINEMA_SESSION ON CINEMA_SESSION.tid = THEATER.tid WHERE THEATER.tid = 2 AND CINEMA_SESSION.sid = 2
虽然你通过JOIN指定了sid=2的场次,但你更新的是THEATER表的记录。因为THEATER.tid=2是唯一的主键记录,只要JOIN匹配到这条场次(sid=2),就会把整个影院(tid=2)的SeatsAvailable减1。而所有关联这个影院的场次(比如sid=3),查询的都是同一个THEATER表的字段,所以自然会看到数值被更新了。
两种解决方案,看你的业务需求
1. 每个场次需要独立的可用座位(最常见场景)
如果你的业务逻辑是不同场次的座位是分开统计的,那SeatsAvailable字段放错地方了——应该把它移到CINEMA_SESSION表中,然后修改UPDATE语句为更新场次表:
UPDATE CINEMA_SESSION SET SeatsAvailable = SeatsAvailable - 1 WHERE tid = 2 AND sid = 2
这样只会更新sid=2的场次的座位数,完全不会影响sid=3的场次。
2. 确实要维护影院总座位数
如果你的业务就是要统计整个影院的总剩余座位,那当前的UPDATE语句是没问题的,但你的查询逻辑错了——你不该通过场次sid=3去查影院的总座位数,因为总座位数是影院级别的,和场次无关。正确的查询应该直接查THEATER表:
SELECT SeatsAvailable FROM THEATER WHERE tid = 2
小提示
在SQL Server里用UPDATE ... FROM语法时,一定要盯紧你更新的是哪个表的记录。如果目标表的主键是唯一的,哪怕JOIN匹配到多条记录,也只会更新一次目标记录;但如果目标表主键不唯一,可能会导致重复更新,这点要特别注意。
内容的提问来源于stack exchange,提问作者Iwishiwassmart

