2012-10-13 93 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