InnoDB中大量插入的顺序插入ID

时间:2013-04-09 15:55:31

标签: php mysql pdo innodb

任何人都可以确认,当使用PDO(PHP)在单个插入语句中插入多行时,MYSQL中的InnoDB数据库将顺序生成AI ID吗?

我正在开发一个项目,用户可以通过excel文件中的行上传excel文档。这些文件可以是一行到~10,000。对于速度,我希望能够在块中插入这些,如果不是全部在一个查询中。

根据我的阅读,看起来使用最后一个插入ID减去插入次数来获取插入的id块是安全的。

是否有任何人对此不具有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);

1 个答案:

答案 0 :(得分: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),
    ...
);