【问题标题】:mysql manual increment ids?mysql手动增加ID?
【发布时间】:2010-07-09 18:57:56
【问题描述】:

我有一个包含项目(id、名称等)的表,我希望某种数据库方案能够拥有项目的多个副本,同时仍然能够增加 id。会有一个名为 startdate 或 date_from_which_this_entry_should_be_used 的字段。

我想到了两种实现方式:

  1. 有一个只有 ids(主键,自动增量)的表,并连接到一个包含所有项目信息的表。

    优点:

    • 简单易懂
    • 很难让追我的人感到困惑

    缺点:

    • 需要更多的调试和编码,因为该系统已经在使用中
    • 只有一个字段的表格似乎很奇怪
  2. 有一个使用子选择的表来获取 MAX 值 (+1) 以应用于新项目。

    优点:

    • 单表
    • 只有很小的代码调整(但可能不是完全不同)

    缺点:

    • 容易出错(手动增量,不允许删除或 MAX 值可能已关闭)

提前致谢!

【问题讨论】:

    标签: mysql auto-increment


    【解决方案1】:

    您应该创建一个名为 item_ids 的表或其他东西来生成 id 值。没关系,这只有一列。

    CREATE TABLE item_ids (
      item_id INT AUTO_INCREMENT PRIMARY KEY
    ) ENGINE=InnoDB;
    

    您甚至不需要向其提交任何数据。您只需使用它来生成 id 值:

    START TRANSACTION;
    INSERT INTO item_ids DEFAULT VALUES;
    SET @id = LAST_INSERT_ID();
    ROLLBACK;
    

    所以现在你有一个并发安全的方法来创建新的 id。

    然后为items 表创建一个复合主键。为此,您必须使用 MyISAM。

    CREATE TABLE items (
      item_id INT,
      seq_id INT AUTO_INCREMENT,
      name VARCHAR(20),
      etc VARCHAR(20),
      PRIMARY KEY (item_id, seq_id)
    ) ENGINE=MyISAM;
    

    MyISAM 支持复合主键中的自动递增列,对于每个新的 item_id,它将从值 1 开始。* 它还使用 MAX(item_id)+1,因此如果您删除最后一个,它的值将被重新分配.这与 AUTO_INCREMENT 的其他用法不同,其中删除的值不会被重新使用。

    无论您插入新项目,还是插入现有项目的新副本,都使用类似的 INSERT:

    INSERT INTO items (item_id, name, etc) VALUES (@id, 'Stephane', 'etc');
    

    @id 参数要么是现有项目的值,要么是您从 item_ids 表中获得的自动生成的值。

    * InnoDB 仅支持将自动递增作为主键或唯一键的第一列,并且不会从另一列的每个不同值的计数开始。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-02
      • 2011-04-26
      • 2010-12-09
      • 2014-10-01
      • 1970-01-01
      • 2016-10-16
      • 1970-01-01
      • 2014-05-01
      相关资源
      最近更新 更多