Ste*_*ane 2 mysql auto-increment
我有一个包含项目的表(id,name等),我希望某种数据库方案能够拥有该项目的多个副本,同时仍能增加ID.会有一个名为startdate或date_from_which_this_entry_should_be_used的字段.
我想到了两种实现方法:
有一个只有id(主键,自动增量)的表,并连接到包含所有项目信息的表.
好处:
缺点:
使用子选择使用单个表来获取MAX值(+1)以应用于新项目.
好处:
缺点:
提前致谢!
您应该创建一个名为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仅支持自动增量作为主键或唯一键的第一列,并且它不会从另一列的每个不同值开始计数.
| 归档时间: |
|
| 查看次数: |
3235 次 |
| 最近记录: |