2010-02-18 116 views
2

今天早些时候,我问了this question哪些产生于A-我的不良计划和B-我完全无视正常化数据库的做法。我花了最近8个小时阅读关于正常化数据库和JOIN的更精细的点,并通过SQLZoo.com教程工作。如何获取我刚刚插入的文件的主键ID?

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

这是我的旧愿景:一个名为“文件”的表格,让我们说一个文件ID和一个文件url以及该文件的appropos等级。

新视野!:1个表格用于“文件”,1个表格用于“成绩”,以及一个中介表格。

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

如果我上传text.doc并获得file_id 123,我怎么知道它得到了123才能将它写入“等级”和联结表?我不能做一个max(file_id),因为如果你有并发用户,你可能会获得一个不同的ID。我只是不知道如何获得file_id值而没有手动分配它。

回答

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

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

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

+0

实际文件表包含大量有关该文件的数据 - 上传它的用户,该文件的唯一S3 URL等 这里的愿景是,其他用户根据一组浏览这些文件的搜索标准。我可以将文件的id发布到显示脚本并从那里翻录。 – GilloD 2010-02-19 02:24:53

相关问题