2013-11-22 76 views
0

我有一大串數據,我想插入到數據庫中。 數組中的每個元素都表示數據庫中行的另一個數組。 對於每個元素,我創建一個ActiveRecord實例。 可以有多達10K(以及更多)的元素,我通過cron將它們插入到數據庫中。在每次插入之前,我的ActiveRecord會運行驗證並進行一些選擇。MySQL創建多餘的重複行

但有時我會在數據庫中得到重複項。爲了簡化,我的下一個數據數組:

Field1   Field2   Field3 
field1Value1  field2Value1 field3Value1 
field1Value2  field2Value2 field3Value2 
field1Value3  field2Value3 field3Value3 
field1Value4  field2Value4 field3Value4 

而且在我的數據庫,我可以得到這樣的:

id Field1   Field2   Field3   time 
1 field1Value1 field2Value1 field3Value1 2013-11-11 17:17:40 
2 field1Value2 field2Value2 field3Value2 2013-11-11 17:17:40 
3 field1Value4 field2Value4 field3Value4 2013-11-11 17:17:40 
4 field1Value2 field2Value2 field3Value2 2013-11-11 17:17:40 
5 field1Value3 field2Value3 field3Value3 2013-11-11 17:17:40 

在這種情況下與value 2行插入兩次。還要注意與value 4這一行緊接在value 2之後插入的行。

問題是這些情況是偶然的,我在這裏找不到模式。我嘗試使用交易,但它沒有解決問題。

在我的PHP代碼中,我只是創建一個新的ActiveRecord實例的循環。沒有辦法讓一行插入兩次。所以這個問題必須在MySQL中。

+0

提供代碼。這沒用。 – Havenard

+0

這很可能是您的代碼中存在問題。無法看到第012行代碼 – Paolo

+0

我無法提供代碼。它包含在許多班,每班有近千行。 我只是想知道這個問題是否可能是由MySQL引起的(可能是錯誤的配置)。如果沒有辦法,我會仔細檢查我的代碼。 – serg66

回答

1

我總是建議儘可能保持數據庫級別的數據完整性。如果您不應該有上述三列的重複值,請爲數據庫表上的這三列添加唯一索引。如果腳本正在循環並插入數據,則在違反唯一索引時會失敗,並且會阻止該情況。這是我可以提供的最好的建議,而無需查看製作插入的代碼。

CREATE UNIQUE INDEX index_name ON table(field1,field2,field3);

+0

謝謝你,德里克。這是防止重複的最佳方法。 – serg66