1

谁能确认 MYSQL 中的 InnoDB 数据库在使用 PDO(PHP)在单个插入语句中插入多行时会按顺序生成 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);
4

1 回答 1

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),
    ...
);
于 2013-04-09T16:01:08.367 回答