2012-10-13 58 views
1

我有一个触发器的奇怪问题。我想插入数据到名为'profile'的表中,并且我想让触发器填充'profile'的某些列,如果它存在于名为'profile_info'的另一个表中的话。如果它在'profile_info'中不存在,那么触发器应该将该记录的id添加到'profile_info'以稍后填充。选择触发器工作不正确

CREATE TRIGGER `info_filler` BEFORE INSERT ON `profile` 
FOR EACH ROW begin 

select info1, info2, info3, id from 
profile_info where id = new.id into @i1, @i2, @i3, @id; 
set new.info1 = @i1; 
set new.info2 = @i2; 
set new.info3 = @i3; 
If @id is null THEN 
insert into profile_info (id) values (new.id); 
END IF; 
end 

触发工作得很好,当我添加记录,以“曲线”逐一检查其是否正常工作。但是,当同时添加多条记录(每秒超过1500条)时,问题就开始出现。一些添加到配置文件中的记录有错误的info1,info2,info3列。例如,在“个人资料”表格我有这样的值:

| id  | info1  | info2  | info3  | 
|-----------|------------|------------|------------| 
| 1   |  10  |  23  |  12  | 
| 2   |  10  |  23  |  12  | 
| 3   |  10  |  23  |  12  | 
| 4   |  7  |  42  |  73  | 
| 5   |  5  |  45  |  33  | 
| 6   |  5  |  45  |  33  | 
| 7   |  NULL |  NULL |  NULL | 

我的问题是,行2,3,6对INFO1,INFO2和INFO3错误的值,其值属于另一行。这些行也不会添加到'profile_info'中。 1,4,5和7是好的,7也被添加到'profile_info'。

我知道,我不应该将相同的信息复制到另一张桌子上,我也在努力。但是现在我需要这个触发器来工作,而且我不知道我做错了什么。任何帮助将非常感激。

我使用mysql 5.5和innodb。插入由多台计算机的python完成。

回答

0

,如果你将其更改为发生的事情:

select info1, info2, info3, id from 
profile_info where id = new.id into @i1, @i2, @i3, @id; 
If @id is null THEN 
    insert into profile_info (id) values (new.id); 
ELSE 
    set new.info1 = @i1; 
    set new.info2 = @i2; 
    set new.info3 = @i3; 
END IF; 
+0

我会给它一个尝试,让你知道。我知道我应该先把触发器正确地写在第一位:) – boran

+0

我试过了,就像你说的,但它没有帮助。显示此错误的记录在同一秒内添加,我认为这可能是性能问题 – boran

+0

如果您在启动时锁定配置文件会发生什么情况 - 退出之前解锁? – ethrbunny