【问题标题】:Use auto increment only when needed仅在需要时使用自动增量
【发布时间】:2017-04-13 07:29:49
【问题描述】:

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

【问题讨论】:

  • 不应该是`id` int(11) NOT NULL AUTO_INCREMENT,吗?
  • id的时候应该是唯一的吧?
  • 是的,对于错误的语法,我很抱歉,但这不是必需的。好的,我可以更改 id 列的名称,但问题的想法保持不变,不是吗? :-) 另一件事是,正如@sagi 在答案中所说,auto_increment 只能用于唯一值。

标签: mysql insert auto-increment


【解决方案1】:

正如auto_increment 上的 MySQL 文档所说(突出显示是我的):

没有为 AUTO_INCREMENT 列指定值,所以 MySQL 自动分配序列号。您也可以明确地 将 0 分配给列以生成序列号,除非 NO_AUTO_VALUE_ON_ZERO SQL 模式已启用。如果声明了列 NOT NULL,也可以将NULL赋给要生成的列 序号。 当您将任何其他值插入 AUTO_INCREMENT 列,该列设置为该值并且 序列被重置,以便下一个自动生成的值 从最大的列值开始依次排列。

这意味着,如果您在插入之前确定 auto_increment 字段的当前最大值,并在插入语句中显式插入该值,那么您可以在 auto_increment 字段中有重复值。

有几点需要注意:

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

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

另一种方法是为 auto_increment 设置一个单独的表,并且不要在主表中使用 auto_increment。如果您需要一个新的 id,那么只需将一条记录插入到 auto_ncrement 表中,然后获取递增的 id 并使用它将记录插入到主表中。否则,只需从主表中获取 id 值并在插入中使用它。

【讨论】:

  • 谢谢,我使用了替代解决方案,看起来不错。
【解决方案2】:

auto_increment 列确保其中的值唯一!所以,你不能这样做。

我建议使用触发器,结合所需的逻辑。

【讨论】:

  • 好吧,我不知道标准是什么,所以没有。
【解决方案3】:

对于 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 列开头的索引生成序列值(如果有的话)。例如,如果动物表包含索引 PRIMARY KEY (grp, id) 和 INDEX (id),MySQL 将忽略 PRIMARY KEY 来生成序列值。结果,该表将包含单个序列,而不是每个 grp 值的序列

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-19
    • 2016-09-30
    • 2017-10-14
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多