我正在将图片文件上传至存储服务器。在上传之前,我应该组合包含自增值的文件名(例如:12345_filename.jpg)。
我该如何在插入数据库之前获取自增值?
我只看到了一个解决方案:
- 插入空行
- 获取它的自增值
- 删除此行
- 使用步骤1中的自增值插入真实数据的行
是否有其他解决方案?
谢谢
我正在将图片文件上传至存储服务器。在上传之前,我应该组合包含自增值的文件名(例如:12345_filename.jpg)。
我该如何在插入数据库之前获取自增值?
我只看到了一个解决方案:
是否有其他解决方案?
谢谢
自增值是在插入操作完成后由数据库自动生成的,这意味着您不能在实际执行插入查询之前获取它。
您提出的解决方案并不常用,常用的方法是:
where
子句中使用之前生成的自增值来确定要更新哪一行。当然,作为安全预防措施,所有这些操作都必须在一个事务中进行(以确保“全有或全无”的行为)。
伪代码如下:
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
uniqid()
的东西。 - Stephen Melrose好的,试试这个:
$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"
[...]
}
$nextId = $db->query("SHOW TABLE STATUS LIKE 'tablename'")->fetch(PDO::FETCH_ASSOC)['Auto_increment'];
其中tablename
被替换为您的表名。
没有解决方案。你只能在插入新行时获得自动递增的值,没了。插入和删除都无济于事,因为下一个自动递增的值会比当前的高一。由于可能有多个客户端同时访问数据库,你无法预测下一个值,因为它可能在你猜测和实际插入之间被递增。
找到另一个解决方案。要么先插入一行再稍后更新,要么为文件名生成一个与自动递增id无关的id。
@Pascal Martin提出了一个很好的观点。在这种情况下,我个人喜欢添加另一个ID列,其中包含一个随机的、16位数的ID(出于安全考虑,在Web应用程序和网站上也将是“公共”ID)。您可以预先设置这个随机ID,在应用程序中使用它,然后在实际创建记录时进行设置。
使用一个单独的表作为计数器,就像postgresql序列一样,不要在主表中使用auto_increment。
将 firstname 和 lastname 插入 CONTACTS1 表中,值为 ('hi',select auto_increment from information_schema.TABLES where TABLE_NAME='CONTACTS1' and TABLE_SCHEMA='test')。
其中 ID 是主键和自动编号列。
虽然这已经过时了,但如果有其他人需要它。
您可以在“information_schema”表中获取此类值,例如:
select AUTO_INCREMENT from TABLES where TABLE_SCHEMA = 'You're Database' and TABLE_NAME = 'Table Name'
所以这种元数据总是存储在 Information_schema 中。
AUTO_INCREMENT
获取的ID在分配给数据库中的行之前是无用的,因为在那一点上它不能保证是唯一的。 - cHao