2013-04-05 50 views
0

我已經看到類似的問題,但沒有一個看起來完全適合這種情況。MySql觸發器在另一個表中插入一條記錄,如果id不是重複的

我有2個表格,帳單和帳戶。

如果帳單被推入帳單表並且還沒有帳戶,我想在帳戶表中創建一條記錄。

我:

... 
    BEFORE INSERT ON bills 
    FOR EACH ROW 
    BEGIN 
     INSERT INTO accounts (id, field1, field2, field3, field4) 
     SELECT accountID, 'value1', value2, value3, value4 
     FROM bills 
     WHERE ((SELECT LEFT(accountID, 5) = 'XXXXX' | 
     (SELECT LEFT(accountID, 5) = 'XXXXX' | 
     (SELECT LEFT(accountID, 5) = 'XXXXX' | 
     (SELECT LEFT(accountID, 5) = 'XXXXX' | 
     (SELECT LEFT(accountID, 5) = 'XXXXX')) && 
     accountID NOT IN (SELECT id from accounts); ## I know this line is not right 
    END$$ 

從我的SO其他地方讀我的選擇似乎是在重複鍵更新或插入忽略,這兩者都不我似乎可以做的工作,也不是我能找到的例如INSERT,SELECT,FROM和WHERE都涉及到。

我錯過了什麼?

編輯:我可以讓它插入記錄,但取決於我如何嘗試它,我總是得到「重複ID」錯誤,或它不插入記錄。

+1

請添加表格結構和示例數據。 – 2013-04-05 16:55:51

回答

1

在MySQL中沒有編碼很長一段時間,所以請原諒,如果有一些小的語法錯誤。然而,你會得到的想法需要在下面的代碼做什麼:

before insert on bills 
for each row 
begin 
    declare @li_cnt int; 
    select count('') into @li_cnt from accounts where accounts.id_account = inserted.id_account; 
    if @li_cnt = 0 then 
    insert into accounts (id_account) values (inserted.id_account) 
    end 

end 

然而,這種類型的問題,應在中間層應用服務器級別而不是數據庫觸發電平,其中一個應該處理實際執行嚴格的政策,不遵守業務要求。因此,在這方面,假設您的應用程序是一個PHP Web應用程序,您應該使用賬單的類方法save(),它應該檢查相同的內容,並使用賬戶表的類在賬戶表中插入值,然後將行插入票據表。使用這種方法可以真正製造出現代的複雜邏輯,如果您從賬單插入調用的賬戶類別方法發回退回響應,您可以限制特定賬戶的賬單插入。雖然看起來您需要在帳單代碼/ ID插入帳單代碼/ ID的情況下插入數據到帳戶表中,但我依然認爲即使在簡單的需求中編寫正確的方式也是一個很好的平臺一個應用程序後來擴大規模,併成爲相當複雜的最小問題維護成本。

+0

不幸的是,在我的情況下,我無法控制數據,並且它被我無法控制的權力推送到MySql數據庫。數據庫沒有通過我的應用程序填充。我的應用程序只顯示數據。我意識到這不是一個理想的解決方案。但是,謝謝,我會給它一個回報並報告。 – deez 2013-04-08 13:34:49

+0

我得到它的工作。謝啦。 – deez 2013-04-08 14:51:05

相關問題