我的数据库"id" int(11) NOT NULL AUTO_INCREMENT,
中有一列,我希望此表中的多行具有相同的id
值。因此,当插入表格时,我想告诉它是否应该增加或值仍然是sasme。有什么简单的方法可以做到吗?
答案 0 :(得分:1)
正如auto_increment上的MySQL文档所述(突出显示是我的):
没有为AUTO_INCREMENT列指定值,因此MySQL 自动分配序列号。你也可以明确地说 将0分配给列以生成序列号,除非 NO_AUTO_VALUE_ON_ZERO已启用SQL模式。如果声明了列 NOT NULL,也可以为列分配NULL来生成 序号。 当您插入任何其他值时 AUTO_INCREMENT列,该列设置为该值和 序列被重置,以便下一个自动生成的值 从最大列值开始依次跟踪。
这意味着,如果您在插入之前确定auto_increment字段的当前最大值并且您在insert语句中显式插入该值,那么您可以在auto_increment字段中具有重复值。
有几件事你需要注意:
如果您可以将并行插入到表中,那么您可能必须锁定表以进行读取,因此另一个进程不会插入新记录来触发字段的增量。
您不能在auto_increment字段上使用主要/唯一索引约束。
另一种方法是为auto_increment设置一个单独的表,并且不要在主表中使用auto_increment。如果您需要一个新的id,那么只需在auto_ncrement表中插入一条记录,然后获取递增的id并使用它将记录插入主表。否则,只需从主表中获取id值并在插入中使用它。
答案 1 :(得分:0)
auto_increment
列可确保其中的值唯一!所以,你不能这样做。
我建议使用触发器,结合所需的逻辑。
答案 2 :(得分:0)
对于MyISAM表,您可以在多列索引中的辅助列上指定AUTO_INCREMENT。在这种情况下,AUTO_INCREMENT列的生成值计算为MAX(auto_increment_column)+ 1 WHERE prefix = given-prefix。当您想要将数据放入有序组时,这非常有用。
CREATE TABLE animals (
grp ENUM('fish','mammal','bird') NOT NULL,
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR(30) NOT NULL,
PRIMARY KEY (grp,id)
) ENGINE=MyISAM;
INSERT INTO animals (grp,name) VALUES
('mammal','dog'),('mammal','cat'),
('bird','penguin'),('fish','lax'),('mammal','whale'),
('bird','ostrich');
SELECT * FROM animals ORDER BY grp,id;
Which returns:
**grep id name**
fish 1 lax
mammal 1 dog
mammal 2 cat
mammal 3 whale
bird 1 penguin
bird 2 ostrich
如果AUTO_INCREMENT列是多个索引的一部分,则MySQL使用以AUTO_INCREMENT列开头的索引(如果有)生成序列值。例如,如果animals表包含索引PRIMARY KEY(grp,id)和INDEX(id),则MySQL将忽略PRIMARY KEY以生成序列值。因此,该表将包含单个序列,而不是每个grp值的序列