2015-11-19 1 views
0

Я вставляю данные из текстового файла в базу данных mySQL и будет вставлен около 6000 или более записей за один раз.Как я могу вставить много данных в базу данных mySQL сразу?

try { 
    $sql = "INSERT INTO data (id,name,date,place) values(?,?,?,?) "; 
    $q = $pdo->prepare($sql); 
    foreach($data as $row) { 
     $q->execute(array($row['id'], $row['name'], $row['date'], $row['place'])); 
    } 
} 
catch (PDOException $pe) { 
    echo $pe->getMessage(); 
} 
catch (Exception $e) { 
    echo $e->getMessage(); 
} 

Я пробовал его с 3000 записей, и все работает нормально. Но если у меня есть больше данных для вставки, бывает, что моя страница пуста, и ничто не добавлено в мою базу данных.

Что может вызвать эту проблему и как ее решить?

+0

Страница не должна быть пустой. Включите отчет об ошибках и посмотрите, какую ошибку вы получаете. – Andrius

+1

Вы пытались увеличить время ожидания скрипта? – madforstrength

+0

Благодарим вас за ответы. Should't 'catch (PDOException $ pe) { echo $ pe-> getMessage();}' дать мне сообщение об ошибке? – Jarla

ответ

2

Поскольку у вас уже есть текстовый файл, а затем использовать ниже запрос

LOAD DATA INFILE 'file/path/to/file.txt' 
INTO TABLE table-name 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"' 
LINES TERMINATED BY '\n' 
IGNORE 1 ROWS; 

Убедитесь, что ваши данные в файл в последовательности с вашими строк таблицы.

Подробнее здесь https://dev.mysql.com/doc/refman/5.6/en/load-data.html

+0

делает LOAD DATA INFILE работает только с csv? – Jarla

+1

Он также работает с txt-файлами, а также – Mathew

0

Операторы NSERT, которые используют синтаксис VALUES, могут вставлять несколько строк. Для этого включите несколько списков значений столбцов, каждый из которых заключен в круглые скобки и разделен запятыми. Пример:

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9); 

От How to do a batch insert in MySQL

0

Вместо выполнения нескольких запросов внутри цикла, вы должны использовать синтаксис мульти-вставки. Пример:

INSERT INTO data (id,name,date,place) VALUES (:id1,:name1,:date1,:place1), (:id2,:name2,:date2,:place2), (:id3,:name3,:date3,:place3); 

Заканчивать this article делать мульти-вставки с подготовленными операторами.

+0

Спасибо, я не уверен, как именно вы это имеете в виду, я не могу написать name1, name2, name3 и т. д., потому что у меня есть, например, 5000 имен и не знаю точно сколько. – Jarla

1

Использование MySQL LOAD DATA INFILE

см This Answer

Если вы используете PDO или тому подобное с зацикливание, вы делаете это неправильно, и медленно.

+0

Спасибо за ваш ответ, кажется, это очень приятное решение, но, похоже, это очень сложно, я все еще не понимаю, как это работает , Я разбираю текстовый файл и помещаю все в переменные, чтобы сделать проверку, прежде чем вставлять данные в базу данных. Должен ли я писать свой код совершенно новым? – Jarla

+0

Суть заключается в том, чтобы позволить mysql и загружать данные infile для вас в зависимости от вас в медленных циклах.Они построили эту функциональность для повышения производительности и не давали людям потеть петли, как на PHP, так и на Java. Плюс он превосходит по 10 – Drew

Смежные вопросы