mysql手动增量ids?

时间:2010-07-09 18:57:56

标签: mysql auto-increment

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

我想到了两种实现方法:

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

    优点:

    • 易于理解
    • 很难找到跟我混淆的人

    缺点:

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

    优点:

    • 单人表
    • 只进行少量代码调整(但可能并非完全不同)

    缺点:

    • 容易出错(手动增量,不允许删除或MAX值可能关闭)
  3. 提前致谢!

1 个答案:

答案 0 :(得分:7)

您应该创建一个名为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仅支持自动增量作为主键或唯一键的第一列,并且它不会从另一列的每个不同值的计数开始。