【问题标题】:MySQL auto incrementMySQL 自动增量
【发布时间】:2010-03-31 21:17:51
【问题描述】:

我有一个带有自动增量字段的表,但我需要将该表转移到另一个数据库上的另一个表。字段 1 的值为 1,字段 2 的值为 2,等等?

如果数据库损坏并且我需要恢复数据,自动增量是否会以某种方式产生影响?价值会改变吗? (例如,如果第一行,id (auto-inc) = 1,name = john,country = UK .... id 字段会保持 1 吗?)我在问,因为如果其他表引用这个值,所有数据都会如果此字段更改,则不同步。

【问题讨论】:

    标签: mysql auto-increment


    【解决方案1】:

    听起来您正试图以相同的顺序将数据分别插入到两个单独的数据库中,并使用自动增量字段来链接这两行。看来您基本上是在问,如果数据以相同的顺序插入,是否可以依赖两个数据库中的自动增量相同。

    如果是这样,答案是否定的——你不能依赖这种行为。自动增量跳过一个值是合法的,例如see here

    但也许你会问,一个自增值在写入并提交后是否会突然变为另一个值?不 - 它们将来不会改变(当然,除非你明确地改变它们)。

    这是否回答了您的问题?如果没有,也许您可​​以再次解释您的问题。

    【讨论】:

      【解决方案2】:

      如果您完全指定 auto_increment 值,则传输数据不会有问题。 MySQL 允许您将任何您想要的内容插入到 auto_increment 字段中,但只有当您插入的值为 0 或 NULL 时才会执行实际的 auto_increment。至少在我的 MySQL 5.0 副本上,它会自动调整 auto_increment 值以考虑您插入的内容:

      mysql> create table test (x int auto_increment primary key);
      Query OK, 0 rows affected (0.01 sec)
      mysql> insert into test (x) values (10);
      Query OK, 1 row affected (0.00 sec)
      mysql> insert into test (x) values (null);
      Query OK, 1 row affected (0.00 sec)
      mysql> insert into test (x) values (0);   
      Query OK, 1 row affected (0.00 sec)
      mysql> insert into test (x) values (5);
      Query OK, 1 row affected (0.00 sec)
      mysql> select * from test;
      +----+
      | x  |
      +----+
      | 5  | <--inserted '5' (#4)
      | 10 | <--inserted '10' (#1)
      | 11 | <--inserted 'null' (#2)
      | 12 | <--inserted '0' (#3)
      +----+
      3 rows in set (0.00 sec)
      

      您也可以调整表格的下一个auto_increment值如下:

      mysql> alter table test auto_increment=500;
      Query OK, 4 rows affected (0.04 sec)
      Records: 4  Duplicates: 0  Warnings: 0
      
      mysql> insert into test (x) values (null);
      Query OK, 1 row affected (0.00 sec)
      
      mysql> select last_insert_id();
      +------------------+
      | last_insert_id() |
      +------------------+
      |              500 | 
      +------------------+
      1 row in set (0.01 sec)
      

      【讨论】:

        【解决方案3】:

        SELECT INTO 应该在目标表上保持相同的 id

        http://dev.mysql.com/doc/refman/5.1/en/ansi-diff-select-into-table.html

        【讨论】:

          【解决方案4】:

          使用 MySQL 备份将执行此操作,如果您创建自己的插入语句,请确保包含您的 id 字段并且将插入值(它不像 MSSQL,您必须设置 identity_insert),需要注意的是如果您生成 DDL,它有时会为您的身份列“错误地”生成(即,它声明起点是您的最后一个身份值?您可能不想要这种行为)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-12-14
            • 1970-01-01
            • 1970-01-01
            • 2016-09-01
            • 2011-12-05
            相关资源
            最近更新 更多