仅在需要时使用自动增量

时间:2016-11-29 10:32:25

标签: mysql insert auto-increment

我的数据库"id" int(11) NOT NULL AUTO_INCREMENT,中有一列,我希望此表中的多行具有相同的id值。因此,当插入表格时,我想告诉它是否应该增加或值仍然是sasme。有什么简单的方法可以做到吗?

3 个答案:

答案 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字段中具有重复值。

有几件事你需要注意:

  1. 如果您可以将并行插入到表中,那么您可能必须锁定表以进行读取,因此另一个进程不会插入新记录来触发字段的增量。

  2. 您不能在auto_increment字段上使用主要/唯一索引约束。

  3. 另一种方法是为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值的序列