我有一个包含项目的表(id,name等),我希望某种数据库方案能够拥有该项目的多个副本,同时仍能增加ID。会有一个名为startdate或date_from_which_this_entry_should_be_used的字段。
我想到了两种实现方法:
有一个只有id的表(主键,自动增量),并且连接到包含所有项目信息的表。
优点:
缺点:
使用子选项创建单个表格以获取MAX值(+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仅支持自动增量作为主键或唯一键的第一列,并且它不会从另一列的每个不同值的计数开始。