如何获取刚刚插入的文件的主键ID?

时间:2010-02-18 11:09:07

标签: sql mysql database-design normalization

今天早些时候,我问this question来自A-我的糟糕计划和B-我完全无视数据库规范化的做法。我花了最后8个小时阅读关于规范化数据库和JOIN的细节,并通过SQLZoo.com教程学习。

我开悟了。我理解数据库规范化的目的以及它如何适合我。除了我不完全确定如何从程序角度执行该愿景。

这是我的旧愿景:1个名为“文件”的表,比方说,该文件包含文件ID和文件URL以及appropos等级。

新视野!:1个“文件”表,1个“成绩”表,以及一个用于调解的联结表。

但这不是我的问题。这是一个非常基本的Q,我确信有一个明显的答案 - 当我在“文件”中创建一个记录时,会自动为其分配增量主键(file_id)。但是,从现在开始,我还需要将file_id写入其他表。因为我没有手动分配该ID,我怎么知道它是什么?

如果我上传text.doc并且它获取了file_id 123,我怎么知道它有123才能将它写入“grade”和联结表?我不能做max(file_id),因为如果你有并发用户,你可能会使用不同的id。我只是不知道如何在没有手动分配的情况下获取file_id值。

3 个答案:

答案 0 :(得分:3)

您可能希望使用LAST_INSERT_ID(),如以下示例所示:

START TRANSACTION;
INSERT INTO files (file_id, url) VALUES (NULL, 'text.doc');
INSERT INTO grades (file_id, grade) VALUES (LAST_INSERT_ID(), 'some-grade');
COMMIT;

事务确保操作保持原子:这可以保证两个插入成功完成或根本不成功。这是可选的,但建议为了保持数据的完整性。

  

对于LAST_INSERT_ID(),最多   最近生成的ID保留在   基于每个连接的服务器。

     

其他客户不会更改。   如果你更新,它甚至没有改变   另一个AUTO_INCREMENT列,带有   非神经价值(即一个值   不是NULL而不是0)。

     

使用   LAST_INSERT_ID()AUTO_INCREMENT   同时从多个列   客户完全有效。每   客户端将收到最后插入的   客户端的最后一个语句的ID   执行。

来源和进一步阅读:

答案 1 :(得分:1)

在PHP中获取自动生成的MySQL记录ID,请使用mysqli对象的mysqli->insert_id属性。

答案 2 :(得分:1)

在你的程序忘记了last_insert_id()的值后,你明天如何找到这个条目?

使用代理键很好,但您的表仍然代表一个实体,您应该能够回答这个问题:什么可衡量的属性定义了这个特定的实体?这些属性的集合是表的自然键,即使您使用代理键,也应始终存在这样的自然键,您应该使用它来从表中检索信息。使用代理键来强制引用完整性,索引purpus并使连接更容易。但是don't let them escape from the database