(mysql,php)如何在插入数据之前获取自动增量字段值?

时间:2010-02-12 11:36:52

标签: php mysql

我正在将图片文件上传到存储服务器。在上传之前,我应该编写文件名,其中包含AUTOINCREMENT VALUE(例如,12345_filename.jpg)。

如何在插入数据库之前获得自动增量值?

我只看到一个解决方案

  1. 插入空行
  2. 获取它的自动增量值
  3. 删除此行
  4. 使用来自p.1
  5. 的自动增量值插入包含实际数据的行

    还有其他解决方案吗?

    谢谢

9 个答案:

答案 0 :(得分:13)

当插入完成时,自动增量值由数据库本身生成;这意味着在进行实际的插入查询之前,你无法获得它。

您提出的解决方案不是经常使用的解决方案 - 这将是:

  • 插入一些半空数据
  • 获取已生成的自动增量值
  • 使用该自动增量值进行计算
  • 使用where查询的update子句中先前生成的自动增量来更新行以放置新/完整数据,以确定正在更新哪一行。

当然,作为安全预防措施,所有这些操作都必须在事务中进行(以确保“全有或全无”行为)


作为伪代码:

begin transaction
insert into your table (half empty values);
$id = get last autoincrement id
do calculations
update set data = full data where id = $id
commit transaction

答案 1 :(得分:7)

好吧,试试这个:

$query = "SHOW TABLE STATUS LIKE 'tablename'";
$result = mysql_query($query);
$row = mysql_fetch_assoc($result);
var_dump($row);

输出:

array(18) {
[...]
["Auto_increment"]=> string(4) "3847"
[...]
}

这将是您的下一个auto_increment ID。

答案 2 :(得分:1)

没有解决方案。插入新行,完全停止时,您将获得自动增量值。插入和删除无济于事,因为下一个自动增量值将高一个。可能多个客户端同时与数据库通信,您无法预测下一个值,因为它可能会在您的猜测和实际插入之间递增。

寻找其他解决方案。插入一行并稍后更新,或者为文件名生成一个独立于自动增量ID的id。

答案 3 :(得分:1)

如果你使用PDO ,这是一个“单行”解决方案:

$nextId = $db->query("SHOW TABLE STATUS LIKE 'tablename'")->fetch(PDO::FETCH_ASSOC)['Auto_increment'];

其中tablename被您的表替换。

答案 4 :(得分:0)

@Pascal Martin提出了一个很好的观点。在这种情况下,我个人希望添加另一个ID列,其中包含一个随机的16位ID(出于安全原因,它也将是Web应用程序和网站上的“公共”ID)。您可以在应用程序中预先设置此随机ID,使用它,然后在实际创建记录时进行设置。

答案 5 :(得分:0)

INSERT INTO CONTACTS1(firstname,lastname)值('hi',从information_schema.TABLES中选择auto_increment,其中TABLE_NAME ='CONTACTS1'和TABLE_SCHEMA ='test')

ID是主要密钥&自动编号栏。

答案 6 :(得分:-1)

使用单独的表作为计数器,如postgresql序列,并且不要在主表中使用auto_increment。

答案 7 :(得分:-2)

这是旧的,但如果其他人需要它。

您可以在“ information_schema ”表格中获得此类价值,您可以在此处执行此类操作

select AUTO_INCREMENT from TABLES where TABLE_SCHEMA = 'You're Database' and TABLE_NAME = 'Table Name'

所以这种元数据总是存储在Information_schema中。

答案 8 :(得分:-4)

使用mysql_insert_id()获取最后一个ID,然后使用+ 1