如何在INSERT之前获取mysql行的ID

Posted

技术标签:

【中文标题】如何在INSERT之前获取mysql行的ID【英文标题】:How to get the ID of a mysql row before INSERT 【发布时间】:2011-11-18 11:51:23 【问题描述】:

我可以通过 mysql_insert_id(); 在 INSERT 之后获取 ID;但我想以 ID-image_name.jpg 的形式保存图像并将其保存在名为 Image_Name 的列中。如何使用即将到来的 ID 保存图像?还是在 INSERT 处理后保存图像文件更好?

【问题讨论】:

保存后,你无法百分百确定下一个ID是什么。 您是否有任何特殊原因要将 ID 包含在图像的文件名中?我只是为所有传入文件创建一个随机文件名,然后将该文件名保存在数据库记录中。 【参考方案1】:

在 INSERT 过程之后保存它是最直接的方法。

mysql_query("INSERT INTO....."); // etc. etc.
$id = mysql_insert_id();
mysql_query("UPDATE table SET image = '$image_name' WHERE id = '$id'");

【讨论】:

【参考方案2】:

是的,最好在 INSERT 之后保存图像。如果保存文件当然失败,您将需要撤消 INSERT(使用 DELETE 或回滚事务)。如果您使用标准命名方案,则无需再次访问数据库来设置表中的文件名(因为表中不需要有文件名)。

【讨论】:

+1 表示表格中不需要文件名 这是为什么呢?你能解释一下吗? @srivani:如果您总是将图像称为/some/path/image-$id.$ext,那么您不需要数据库中的文件名,您只需要一个可以将碎片粘贴在一起的函数;你会想要数据库中的 MIME 类型,这会给你扩展。一个好处是,如果您决定重新排列文件系统,则不必修复数据库。【参考方案3】:

您可以使用临时唯一名称(例如 20 个字母的随机字符串)保存图像,并在插入完成后重命名。

【讨论】:

【参考方案4】:

正如其他人所说,您无法在 INSERT 之前可靠地获取 ID。

如果要求图像文件名与行 ID 匹配,我会坚持 mu 的建议(在事务中插入、保存文件、更新行、提交事务)。

另一种方法(如果您不要求 id 匹配文件名)是使用 uniqid() 命名文件。这将允许您使用单个查询保存文件并插入行,而无需打开事务。

【讨论】:

以上是关于如何在INSERT之前获取mysql行的ID的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MySQL 中获取多个插入行的 ID?

执行 INSERT 到数据库获取插入行的 id 后如何获取?

如何在没有'id'列的MySql中获取最后插入的记录?

mysql主见自增,新增对象之后如何获取自增列

如何编写 MySQL 触发器以将行插入另一个表?

如何在MySQL中的INSERT语句中使用SELECT MAX?