ЗАГРУЗИТЬ ДАННЫЙ ЛОКАЛЬНЫЙ ИНФИЛЬ из fputcsv: данные не записаны - PullRequest
0 голосов
/ 28 августа 2018

У меня ниже CSV-файл: (3 столбца)

998877665544331,,baba
998877665544332,,
998877665544333,,
998877665544334,,test
998877665544335,,
,R32AS00ZZYY,
998877665544337,,
998877665544338,,
998877665544339,,asfd
998877665544330,,
,R32AS00XXYY,
,R32AS00XXZZ,

Я сохраняю его как файл: fputcsv($fp, array($data0, $data1, $data2));

тогда я хочу сохранить его в БД с этим запросом:

$query = sprintf(
        "LOAD DATA LOCAL INFILE '%s' 
        INTO TABLE devices 
        FIELDS TERMINATED BY ','
        OPTIONALLY ENCLOSED BY '\"' 
        LINES TERMINATED BY '\\n'
        (col0, col1, col2);", addslashes(storage_path('app/file.csv')));

$asdf = DB::connection()->getpdo()->exec($query);

проблема / вопрос:

  1. почему он хранит только первую и шестую записи? как ниже:

    +--+----------------+-------------+--------+------+
    |id| col0           | col1        | col xx | col2 |
    +--+----------------+-------------+--------+------+
    |01|998877665544331 | ""          | NULL   | baba |
    |02| ""             | R32AS00ZZYY | NULL   | ""   |
    +--+----------------+-------------+--------+------+
    

что я пытаюсь достичь: сохраняю все данные соответственно

РЕДАКТИРОВАТЬ: определение моей таблицы:

/*Table structure for table `tabel_name` */

DROP TABLE IF EXISTS `tabel_name`;

CREATE TABLE `tabel_name` (
  `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `col0` VARCHAR(16) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `col1` VARCHAR(12) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `colxx` VARCHAR(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `col2` VARCHAR(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `created_at` TIMESTAMP NULL DEFAULT NULL,
  `updated_at` TIMESTAMP NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `tabel_col0_unique` (`col0`),
  UNIQUE KEY `tabel_col1_unique` (`col1`)
) ENGINE=INNODB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

1 Ответ

0 голосов
/ 28 августа 2018

Вы определили col1 как уникальный:

  UNIQUE KEY `tabel_col1_unique` (`col1`)

И ваши данные имеют неуникальные значения:

998877665544331,,baba
998877665544332,,

Таким образом, первая строка вставляется, но затем вторая не выполняется из-за уникального ограничения.

...