如何避免SQL触发器批量插入国家数据时产生重复?
解决触发器插入country表重复数据的问题
嘿,我看你现在遇到的问题是在触发器里往country表插入数据时会出现重复,咱们来一步步搞定这个问题~
先说说你现有代码的核心问题
你当前的插入语句是直接从jsontable表查询数据,但触发器是AFTER INSERT触发的,这时候应该用SQL Server提供的**INSERTED临时表**来获取刚插入的那批数据——直接查原表会把历史数据也带进来,这大概率就是重复插入的关键原因。
解决方案分两步走
第一步:从根源上阻止重复(推荐)
给country.countryName字段加一个唯一约束,这样哪怕后续逻辑有疏漏,数据库也会直接报错阻止重复数据插入,从底层保障数据唯一性:ALTER TABLE country ADD CONSTRAINT UQ_Country_CountryName UNIQUE (countryName);第二步:修正触发器的插入逻辑
把数据查询源换成INSERTED临时表,同时保留NOT EXISTS的判断逻辑,确保只插入country表里没有的新国家:
修改后的完整触发器代码(重点关注country插入部分)
CREATE TRIGGER main.afterParsing ON main.jsontable AFTER INSERT AS BEGIN -- 禁用计数提示,提升触发器性能(可选但推荐) SET NOCOUNT ON; --Person Variables DECLARE @PersonName NVARCHAR(50) DECLARE @PersonSurname NVARCHAR(50) DECLARE @PersonEmail NVARCHAR(50) DECLARE @PersonAge NVARCHAR(50) DECLARE @PersonCountry NVARCHAR(50) DECLARE @PersonRegistered NVARCHAR(50) --Insert Country:改用INSERTED表获取刚插入的新数据 INSERT INTO country(countryName) SELECT i.country FROM INSERTED i WHERE i.country IS NOT NULL AND NOT EXISTS ( SELECT 1 FROM country c WHERE c.countryName = i.country ); --Get Person --Insert Person(这里你可以继续完善你的Person插入逻辑) END;
额外优化小技巧
如果你的SQL Server版本是2008及以上,还可以用MERGE语句来实现“不存在就插入”的逻辑,写法更直观,还能处理同一次插入里有多个相同国家的情况:
MERGE country AS target USING (SELECT DISTINCT country FROM INSERTED WHERE country IS NOT NULL) AS source ON target.countryName = source.country WHEN NOT MATCHED THEN INSERT (countryName) VALUES (source.country);
内容的提问来源于stack exchange,提问作者user3670236
相关产品推荐
相关产品推荐

