如何在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的主要内容,如果未能解决你的问题,请参考以下文章