我有大量数据,我想将其插入到数据库中。
数组的每个元素代表我的数据库中一行的另一个数组。
对于每个元素,我创建了一个ActiveRecord
实例。
可以有多达10K(和更多)元素,我将它们cron
插入到数据库中。在每次插入之前,我的ActiveRecord运行验证并生成一些SELECT。
但有时我会在数据库中得到重复。为了简化,我有下一个数据数组:
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 :(得分:1)
我总是建议尽可能在数据库级别维护数据完整性。如果您应该永远不会有如上所述的三列的重复值,那么为数据库表上的这三列添加唯一索引。如果脚本循环并插入数据,则在违反唯一索引时它将失败并且它将阻止这种情况。这是我可以提供的最佳建议,而无需查看插入代码。
CREATE UNIQUE INDEX index_name ON table(field1,field2,field3);