【问题标题】:How to set different auto-increment ids for two tables如何为两个表设置不同的自增 id
【发布时间】:2011-11-27 21:26:00
【问题描述】:

我有 2 个表,都具有自动递增的主键,并且我希望两个表之间的 id 是唯一的 - 即不会将两个相等的值用作这些表的主键。

为了说明这一点,我想做一些类似于 facebook 对他们的 ID 所做的事情——在用户、页面、事件等之间共享它们。此外,我想确保将来可以扩展系统。

我现在有三个想法,但无法决定采用其中之一。

  1. 将 ID 增加 10 并从不同的值开始 - 即表 A:1、11、21.... & 表 B:2、12、22 - 这有点愚蠢,因为您丢失了很多 ID

  2. 使用 GUID - 我认为我可以做得更好

  3. 对 id 列使用 unsigned bigint,从一个表的 1 开始,另一个表从足够大的数字开始

最好的方法是什么?还是有别的办法?

谢谢!

【问题讨论】:

    标签: mysql sql auto-increment


    【解决方案1】:

    创建名为 IDs 或类似名称的第三个表。这将是唯一一个带有 auto_increment 的表。它将仅用于生成 id,因此您可以这样做:

    insert into ids (id) values (null);
    @id = select LAST_INSERT_ID();
    insert into users (id, name) values (@id, "Andreas ");
    

    所有其他需要 id 的表也是如此。您可以随时添加第三张表。

    如果您希望您甚至可以在 ids 表中保留有关哪个表保存该行的信息。

    insert into ids (id, table) values (null, "users");
    @id = select LAST_INSERT_ID();
    insert into users (id, name) values (@id, "Andreas ");
    

    【讨论】:

      【解决方案2】:

      使用 GUIDs/UUIDs 或某种维护自己的密钥表的 requestUniqueKey 存储过程。不幸的是,据我所知,没有推荐的方法如何在 MySQL 中存储 UUID(如 MS SQL Server 中的 UNIQUEIDENTIFIER)。

      【讨论】:

        【解决方案3】:

        这些都很好。

        您可以通过将第一个表的增量设置为 2 并将起始偏移量设置为 1 和第二个表的 2 来使用选项 1 而不会丢失任何键。那么表 1 的 ID 将变为 1,3,5...,而表 2 的 ID 将变为 2,4,6...

        3 与选项 1 基本相同。虽然我不喜欢在我的代码中需要区分每个表的 ID 时必须在我的代码中跟踪一些幻数的想法。

        GUID 也很好。它们速度较慢并且需要更多存储空间,但实际上您可能不会注意到任何差异。如果您没有注意到您的应用程序有任何不同,谁在乎呢?

        【讨论】:

          猜你喜欢
          • 2023-01-18
          • 2019-06-18
          • 1970-01-01
          • 2020-01-23
          • 1970-01-01
          • 2010-12-15
          • 1970-01-01
          • 2015-12-22
          • 1970-01-01
          相关资源
          最近更新 更多