2013-04-09 70 views
1

任何人都可以確認在使用PDO(PHP)的單個插入語句中插入多於一行的行時,MYSQL中的InnoDB數據庫將順序生成AI ID?在InnoDB中批量插入的順序插入ID

我正在處理一個項目,用戶可以上傳一個excel文件,該文件被excel文件中的行插入到db中。這些文件可以是一行〜10,000。爲了速度,我希望能夠插入這些塊,如果不是全部在一個查詢中。

從我讀過的文章看來,使用最後一個插入標識減去插入數目可以安全地插入已插入的標識的塊。

有沒有人有任何經驗,這不是100%安全,或任何有關這個問題的信息。

如果它幫助這裏的大概我怎麼會是將其插入

簡體插入示例(我會在套500來這樣做):

for ($i=0; $i < count($rowData['Name']); $i++) { 
    $insetPlaceHolders[":name$i"]=$rowData['Name'][$i]; 
    $insetPlaceHolders[":email$i"]=$rowData['Email'][$i]; 
    $insetPlaceHolders[":password$i"]=$rowData['Password'][$i]; 
    $insetPlaceHolders[":employeeId$i"]=$rowData['EmployeeId'][$i]; 
    $insetPlaceHolders[":startDate$i"]=$formData['StartDate'][$i]; 
    $appendQuery[]="(:name$i,:email$i,:password$i,:employeeId$i,:startDate$i, {$_SESSION['companyId']})"; 
} 
$appendQuery=implode(',',$appendQuery); 
$sth = $this->dbh->prepare("INSERT INTO employees (name, email, password, custom_id, hire_date, company_id) VALUES $appendQuery"); 
$sth->execute($insetPlaceHolders); 
+0

別人可以同時插入有一個單列=壞 – Randy 2013-04-09 15:57:15

+1

順序,是的......連續的,沒有,有沒有關於保證,除非你可以鎖定表格。 – 2013-04-09 15:57:33

+1

我想說,如果您擔心順序地使用ID,那麼您的模式有問題 – 2013-04-09 16:00:06

回答

3

這是不正確的方法做這個。

你會想要兩個表。一個表格保存有關文檔的元數據,另一個表格保存文檔的行信息。

然後,您將在元數據表中插入一條記錄,並檢索爲您生成的ID的值。

然後,您將插入您的詳細記錄,包括元數據ID作爲文檔的參考。那麼,這些ID是否是連續的並不重要。這就是關係數據庫如何存儲這類信息。

你的架構將是這樣的:

create table metadata (
    metadataid int autoincrement primary key, 
    filename varchar(50) not null, 
    ... 
); 

create table details (
    detailid int autoincrement primary key, 
    metadataid int not null references metadata(metadataid), 
    ... 
); 
+0

這只是一個超好主意。 +1 – Sammitch 2013-04-09 16:03:23

+0

嗯,我其實並不想存儲文件,只是這樣用戶才能爲公司創建一組登錄。目前這是通過使用PHPexcel在臨時目錄中讀取文件完成的。 – DAWTSF 2013-04-09 17:10:29

+0

@ user2240634那麼你爲什麼試圖將數據存儲在數據庫中?你爲什麼關心ID的連續性? – 2013-04-09 17:13:09