我想从 Excel 文件中做一些海量数据库填充。最经济的方法是使用INSERT INTO
具有大量值的语句来存储在一个事务中:
INSERT INTO `assortment`(`id`, `sku`, `agroup`, `subgroup`, `title`, `measure_unit`, `price`, `discount`, `imageUrl`, `fileUrl`)
VALUES ([value-1],[value-2],[value-3],[value-4],[value-5],[value-6],[value-7],[value-8],[value-9],[value-10]),
([value-1],[value-2],[value-3],[value-4],[value-5],[value-6],[value-7],[value-8],[value-9],[value-10]),
([value-1],[value-2],[value-3],[value-4],[value-5],[value-6],[value-7],[value-8],[value-9],[value-10]),
([value-1],[value-2],[value-3],[value-4],[value-5],[value-6],[value-7],[value-8],[value-9],[value-10]),
...
然而,为了避免 SQL 注入,我希望绑定参数,yii 为此提供了功能。然而,我似乎不可能为成百上千的价值做到这一点。不是吗?
为了保持 SQL 的健康,我通过 Active Record 属性进行了简单的插入(Yii AR 功能默认清理输入数据):
$auxarr = array();
for ($i = 0; $sheetData[$i]; $i++)
{
$model = new Assortment();
$j = 0;
foreach ($labels as $label)
{
$auxarr[$label] = $sheetData[$i][$j++];
}
$model->attributes = $auxarr;
if (!$model->save())
throw new CHttpException(400, 'Error db storing');
}
这种方法显然是时间效率低的。 有没有什么方法可以在批量 SQL 插入中兼顾安全性和时间效率?