laravel 5中的大容量插入

iecba09b  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(420)

我收到了如下字符串形式的post数据:

data01,data02
data11,
data21,data22
...
dataxx,dataxx

数据可以长达10.000行,第1列是必需且唯一的,第2列是可选的。
因此,请清理字符串(确保列1唯一(仅在输入数据中-不通过db)、格式等),并将其转换为数组:

[0:
    [col1: data01,
     col2: data02],
 1:
    [col1: data11,
     col2: ""],
 2:
    [col1: val11,
     col2: val12],
 .....
 9999:
    [col1: dataxx,
     col2: dataxx],
]

所以这个数组现在在我的控制器上。。。
现在,我个人认为,最好通过stored proc将该数组发送到mysql,并让sp执行大容量插入任务(如果有更好的方法,请告诉我原因)
问题:
如何将该数组传递给mysql?
我应该在重复键忽略时使用insert select吗?
我需要在视图中显示一个报告,告诉用户哪个数据列1被复制(忽略)
还有一个附带的问题,如果我这么做了:

$validator = Validator::make($request->all(), [
    'array.*.column1' => 'unique:items'
]);

它真的会向数据库查询和我一样多的数据量吗(我只是觉得代码性能太贵了

a6b3iqyw

a6b3iqyw1#

我的解决办法是什么
首先定义验证规则,它总是在请求时运行,而不是在db上运行。

$rules = array("column 1"  => "unique:KEY_NAME|required");
$validator = Validator::make($request->all(), $rules);

制作阵列

$data = array(
array('k1'=> 'v1', 'k2'=> 'v2'), all data

);

现在使用 Eloquent::insert(); 把数据传给这个。
好吧,不要查询数据库。只需对最终数据和请求数据进行数组差分。另外再添加一列,说明是否重复。所以这会节省很多时间。

相关问题