【问题标题】:How can I get the Primary Key id of a file I just INSERTED?如何获取刚刚插入的文件的主键 ID?
【发布时间】:2011-01-18 06:53:10
【问题描述】:

今天早些时候,我问this question,这是因为 A- 我的计划不周和 B- 我完全无视规范化数据库的做法。在过去的 8 个小时里,我阅读了有关规范化数据库和 JOIN 的详细信息,并通过 SQLZoo.com 教程进行了学习。

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

这是我的旧愿景:1 个名为“files”的表,其中包含一个文件 id 和一个文件 url 以及该文件的适当等级。

新愿景!:1 个“文件”表,1 个“成绩”表,以及一个用于调解的连接表。

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

如果我上传 text.doc 并获得 file_id 123,我怎么知道它获得了 123 以便将其写入“等级”和连接表?我不能做一个 max(file_id) 因为如果你有并发用户,你可能会得到一个不同的 id。我只是不知道如何在没有手动分配的情况下获取 file_id 值。

【问题讨论】:

    标签: sql mysql database-design normalization


    【解决方案1】:

    您可能希望使用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 执行。

    来源和延伸阅读:

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 实际的文件表包含关于该文件的大量数据——上传它的用户、该文件的唯一 S3 URL 等。这里的愿景是其他用户基于一组搜索条件。我可以将文件的 id 发布到显示脚本并从那里撕下来。
        猜你喜欢
        • 1970-01-01
        • 2018-05-14
        • 1970-01-01
        • 2011-07-31
        • 1970-01-01
        • 2017-07-04
        • 2014-08-23
        • 1970-01-01
        • 2011-07-11
        相关资源
        最近更新 更多