mysql手动增量ids?

Ste*_*ane 2 mysql auto-increment

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

我想到了两种实现方法:

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

    好处:

    • 容易明白
    • 对我而言困难的人来说很难

    缺点:

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

    好处:

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

    缺点:

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

提前致谢!

Bil*_*win 7

您应该创建一个名为item_ids或要生成id值的表.没关系,这只有一列.

CREATE TABLE item_ids (
  item_id INT AUTO_INCREMENT PRIMARY KEY
) ENGINE=InnoDB;
Run Code Online (Sandbox Code Playgroud)

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

START TRANSACTION;
INSERT INTO item_ids DEFAULT VALUES;
SET @id = LAST_INSERT_ID();
ROLLBACK;
Run Code Online (Sandbox Code Playgroud)

所以现在你有一个并发安全的方法来创建新的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;
Run Code Online (Sandbox Code Playgroud)

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

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

INSERT INTO items (item_id, name, etc) VALUES (@id, 'Stephane', 'etc');
Run Code Online (Sandbox Code Playgroud)

@id参数是一个现有项目的价值,否则你从得到自动生成的值item_ids表.

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