【问题标题】:In MySQL 5.0, can one insert into a table with an auto_increment column without updating the auto_increment value?在 MySQL 5.0 中,可以在不更新 auto_increment 值的情况下插入具有 auto_increment 列的表吗?
【发布时间】:2010-12-04 02:24:54
【问题描述】:

我有一个 MySQL 数据库,其中包含一个带有 auto_increment 主键的表。

认为以下定义足以满足此示例:

create table test(id integer not null auto_increment primary key) engine=innodb;

现在,我通常会使用以下语法插入此表:

insert into test() values();

这会适当地更新 auto_increment 值,这很好。

但是,我想在此表中插入一个高值(例如 1000000),但没有让它更新 auto_increment ID。

是否可以在此表中插入高值而不影响 auto_increment ID 的值?

我知道这是一种糟糕的做法,但它会大大简化我必须做的一些事情。

提前致谢。

【问题讨论】:

    标签: mysql database auto-increment


    【解决方案1】:

    MySQL 5.0 允许您将任意值插入到自动递增字段中,但这确实会改变用于自动递增的下一个值。尽管您可以更改自动递增字段将使用的“下一个数字”(使用ALTER TABLE t AUTO_INCREMENT = number),但这必须大于该列中当前的最大值。

    所以,不,您似乎无法实现您的要求。

    【讨论】:

      【解决方案2】:

      你可以给你的行指定你喜欢的 id。例如,给定以下表定义:

      CREATE TABLE IF NOT EXISTS `stack-test` (
        `id` int(10) unsigned NOT NULL auto_increment,
        `name` varchar(255),
        PRIMARY KEY  (`id`)
      );
      

      以下查询将插入具有自动生成的 id 的行:

      INSERT INTO `stack-test` (name) VALUES ('Peter');
      

      并且此查询将插入一行具有用户定义的 id:

      INSERT INTO `stack-test` (id, name) VALUES (5, 'Joe');
      

      通过查询所有行来验证:

      SELECT * FROM `stack-test`;
      

      输出:

      +----+-------+
      | id | name  |
      +----+-------+
      |  1 | peter |
      |  5 | Joe   |
      +----+-------+
      

      更新:请阅读,您不想影响 AUTO_INCREMENT 的值。正如 staticsan 所提到的,AUTO_INCREMENT 字段自动使用最大值加一。有一条语句将计数器重置为某个值,但这仅在表中没有更高值时才有效:

      ALTER TABLE `stack-test` AUTO_INCREMENT = 2;
      

      【讨论】:

        【解决方案3】:

        我有一个类似的问题,虽然我喜欢上面的答案,但我通过使用两个表解决了它。一个用于高ID,另一个用于低ID。它非常适合我的特殊情况。

        【讨论】:

          【解决方案4】:

          我不这么认为——自动递增的字段必须是主键,因此不能为空。

          【讨论】:

          • 我不会在 id 列中插入 NULL 值。我只是在其中插入一个高价值。
          • 嗯,你可以指定 id 作为主键,而不是 auto_increment 它,但你需要负责每次分配它。
          【解决方案5】:

          这是不可能的。当计数器最终达到您插入的那个非常高的数字时,要让事情按照您建议的方式运行,会引入一个重复的 auto_increment 值。

          【讨论】:

            【解决方案6】:

            保留一些初始值而不是最终值怎么样?我的意思是,保留 id,比如保留少于 1000 个。将自动增量种子设为 1001,以便新插入在此之后具有值,并使用 IDENTITY INSERT 在保留范围内添加值。

            希望对你有帮助。

            【讨论】:

              【解决方案7】:

              很抱歉说的很明显,而且我根本不是 RDBMS 专家,但是您的要求是不是太“非正统”以至于它决定了另一种方法?你自己说你知道这是“可怕的做法”。关于自动增量字段的事情难道不是它们仅用于一个目的和一个目的:为特定记录分配唯一的 ID,嗯,将任何意义归因于实际值不是绝对错误的吗?

              那么,试探性地,我可以建议使用另一个字段来做你想做的事吗?

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2016-09-22
                • 1970-01-01
                • 1970-01-01
                • 2012-10-30
                • 2011-04-05
                • 2011-03-30
                • 2017-12-08
                • 1970-01-01
                相关资源
                最近更新 更多