更新TBLTeams的teamnm时,如何同步更新TBLWedstrijd的uitteamnm
如何在更新TBLTeams的teamnm时同步更新TBLWedstrijd的uitteamnm字段
嘿,我来帮你搞定这个同步更新的问题!先把你给出的表结构SQL整理得更易读些:
CREATE TABLE TBLTeams ( teamnm varchar(30) NOT NULL, teamid varchar(10), rondenm varchar(10), primary key(teamnm) ); CREATE TABLE TBLWedstrijd ( thuisteamnm varchar(30) NOT NULL, uitteamnm varchar(30) NOT NULL, wedstrijdid varchar(10), primary key(wedstrijdid) ); ALTER TABLE TBLWedstrijd ADD FOREIGN KEY (thuisteamnm) REFERENCES TBLTeams(teamnm); ALTER TABLE TBLWedstrijd ADD FOREIGN KEY (uitteamnm) REFERENCES TBLTeams(teamnm); CREATE TABLE TBLUitslag ( thuisteamnm varchar(30) NOT NULL, uitteamnm varchar(30) NOT NULL, wedstrijdid varchar(10) NOT NULL, uitteampunt int, thuisteampunt int, primary key(thuisteamnm) ); ALTER TABLE TBLUitslag ADD FOREIGN KEY (wedstrijdid) REFERENCES TBLWedstrijd(wedstrijdid);
针对你提到的需求——更新TBLTeams的teamnm时同步更新TBLWedstrijd里对应的uitteamnm字段,且要求用子查询,这里最适合的方式是用数据库触发器实现,在触发器逻辑里用子查询定位需要更新的记录。
具体实现:创建AFTER UPDATE触发器
下面的触发器会在TBLTeams的teamnm被修改后,自动触发更新TBLWedstrijd中所有匹配原球队名称的uitteamnm字段,完全满足你对子查询的要求:
CREATE TRIGGER trg_UpdateWedstrijdUitteamnm AFTER UPDATE ON TBLTeams FOR EACH ROW BEGIN -- 用子查询获取更新前的teamnm,匹配TBLWedstrijd的记录并更新为新名称 UPDATE TBLWedstrijd SET uitteamnm = NEW.teamnm WHERE uitteamnm = (SELECT OLD.teamnm FROM TBLTeams WHERE teamnm = OLD.teamnm); END;
关键点解释:
OLD和NEW是触发器的特殊变量:OLD代表更新前的球队记录,NEW代表更新后的记录。我们要把TBLWedstrijd里所有关联旧球队名的记录,替换成新的球队名。- 这里的子查询是明确获取旧的teamnm值(虽然直接写
WHERE uitteamnm = OLD.teamnm更简洁,但既然你要求用子查询,这个写法就完美符合要求啦)。
额外推荐:更简洁的级联更新方案
其实数据库本身支持外键级联更新,不需要写触发器和子查询,只要修改外键约束加上ON UPDATE CASCADE,数据库会自动帮你同步更新子表的外键字段,这也是更标准的做法:
-- 先删除原来的外键(需要先查询你的外键名称,比如假设外键名是FK_TBLWedstrijd_Uitteamnm) ALTER TABLE TBLWedstrijd DROP FOREIGN KEY FK_TBLWedstrijd_Uitteamnm; -- 重新添加外键,加上级联更新属性 ALTER TABLE TBLWedstrijd ADD FOREIGN KEY (uitteamnm) REFERENCES TBLTeams(teamnm) ON UPDATE CASCADE;
不过如果你必须用子查询来实现,那前面的触发器方案就是你的最优选择哦。
内容的提问来源于stack exchange,提问作者Dev
相关产品推荐
相关产品推荐

