我有一个表,表中有项目(id、name等),我希望某种数据库方案能够有项目的多个副本,同时还能增加id将有一个名为startdate或date_from_的字段,该字段将用于该项。
我想了两种实现方法:
拥有一个只有id(主键,自动递增)的表,并连接到一个包含所有项信息的表。
优势:
容易理解
对一个追着我来的人来说很难搞糊涂
缺点:
需要更多的调试和编码,因为此系统已在使用中
一张桌子只有一块地似乎很奇怪
使用子选择获取最大值(+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
表生成一个复合主键。你必须用弥撒来做这个。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
,因此,如果删除最后一个,它的值将被重新分配。这与自动递增的其他用法不同,后者不重复使用已删除的值。无论插入新项目,还是插入现有项目的新副本,都使用类似的插入:
INSERT INTO items (item_id, name, etc) VALUES (@id, 'Stephane', 'etc');
参数是现有项目的值,也可以是从表中获得的自动生成值。
*InnoDB只支持自动递增作为主键或唯一键的第一列,并且它不从另一列的每个不同值的计数开始。
关于mysql - MySQL的手动增量ID?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3215698/