从CSV文件为数据库设定种子时出现额外行

72qzrwbm  于 2023-02-27  发布在  其他
关注(0)|答案(1)|浏览(143)

我有一个100万行的CSV数据库,我正在使用以下Seeder将其摄取到Laravel中:

public function run()
{
DB::table("terms")->truncate();

DB::beginTransaction();

$csvFile = fopen(base_path("database/terms.csv"), "r");

while (($data = fgetcsv($csvFile, 100, ",")) !== FALSE) {
  DB::table("terms")->insert([
      "serial" => $data['0'],
      "output" => $data['1']
  ]);
}

fclose($csvFile);

DB::commit();
}

这是播种机正在运行的迁移:

public function up()
{  
    Schema::create('items', function (Blueprint $table) {
        $table->mediumIncrements("id");
        $table->string("serial")->unique();
        $table->string("output");
    });

    $seeder = new ItemsSeeder();
    $seeder->run();
}

我不能使用分块,因为为数据创建Eloquent模型对我来说没有意义,所以我使用数据库事务来提高性能(这将摄取时间从一个小时减少到半个小时)。作为一个解决方案,这很好用,除了它向表中额外添加了几百行。更奇怪的是,当我颠倒排序顺序检查最后一行时,如预期的那样,它的id1000000(一百万),这表明没有添加额外的行。
这是怎么回事?

q3qa4bjr

q3qa4bjr1#

你凭什么认为你有多余的行?
如果您按照 “tool” 中显示的行计数进行操作,它可能显示的是SHOW TABLE STATUS返回的近似行计数。
SELECT COUNT(*) FROM terms是否返回您所期望的1M?

相关问题