今天早些时候,我问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值。
答案 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