MySQL为什么我的自动增量在插入时不会从1开始?

时间:2012-04-03 20:17:58

标签: mysql insert auto-increment

为什么当我使用jdbc对我的数据库进行插入时,我的表auto_increments会被抬高。

正在填充的完全空表的示例:

狗牌表

DogId DogName
3     Woofer
4     Kujo
5     Spike

所有者表

OwnerId DogID OwnerName
6       3     George
7       4     John
8       5     Sam

期望的结果

狗牌表

DogId DogName
1     Woofer
2     Kujo
3     Spike

所有者表

OwnerId DogID OwnerName
1       1     George
2       2     John
3       3     Sam

实际代码:

 public void insertStuff(Something d)
  {
    Connection con = null;

    try
    {
      Class.forName("com.mysql.jdbc.Driver");
      con = (Connection) DriverManager.getConnection(
          "jdbc:mysql://" + this.getServer() + "/" + this.getDatabase(), user,
          password);
      con.setAutoCommit(false);

      Statement s1 = (Statement) con.createStatement();
      s1.executeUpdate("INSERT IGNORE INTO DOG (DOG_NAME) VALUES(\""
          + d.getDogName() + "\")");

      Statement s2 = (Statement) con.createStatement();
      s2.executeUpdate("INSERT IGNORE INTO OWNER (DOG_ID,OWNER_TITLE) VALUES ("
          + "(SELECT DOG_ID FROM DEVICE WHERE DOG_NAME =\""
          + d.getDogName()
          + "\"),\"" + d.getOWNER() + "\")");

      Statement s3 = (Statement) con.createStatement();
      s3.executeUpdate("INSERT IGNORE INTO KENNEL " + "("
          + "KENNEL_NAME,+ "OWNER_ID) " + "VALUES " + "( \""
          + d.getKennelName()
          + "\","
          + "\""
          + ","
          + "(SELECT OWNER_ID FROM OWNER WHERE OWNER_TITLE=\""
          + d.getOWNER() + "\")" + ")");

      }

      con.commit();

    }
    catch (Exception e)
    {
      if (con != null)
        try
        {
          con.rollback();
        }
        catch (SQLException e1)
        {
          // TODO Auto-generated catch block
          e1.printStackTrace();
        }

      e.printStackTrace();
    }
    finally
    {
      if (con != null)
        try
        {
          con.close();
        }
        catch (SQLException e)
        {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }
    }
  }

5 个答案:

答案 0 :(得分:3)

在事务中插入行,然后退出事务,也会影响自动增量值。

您可以随时直接重置mysql上的auto_increment值:

alter table <tablename> auto_increment = <some_number>;

但老实说,这有什么关系?值必须是唯一的,但它们不应表示订单。

答案 1 :(得分:2)

我所知道的只有两种情况:

(1)一些记录已被删除

(2)表上有一些触发器可以修改这样的id

请注意,即使您对空表进行了新的插入操作,如果以前有一些行,清空表也不会重置自动增量ID计数器,并且它会从最后一次发出的编号开始继续,而不是从实际记录的数量开始在表格中......

答案 2 :(得分:2)

ALTER TABLE Owner AUTO_INCREMENT = 1;

答案 3 :(得分:1)

您很可能以前从表Dog / Owner中删除了行,这增加了自动增量编号。您需要重置它(或者只为这些表执行DROP / CREATE并重新插入数据):

ALTER TABLE Dog AUTO_INCREMENT = 1;
ALTER TABLE Owner AUTO_INCREMENT = 1;

另一种实现相同目的的方法是运行truncate:

TRUNCATE Dog;
TRUNCATE OWNER;

这将删除数据并重置索引。

答案 4 :(得分:1)

有一个AUTO_INCREMENT变量,它是新插入记录的id。如果已插入10条记录,则AUTO_INCREMENT将设置为11.现在,如果从表中删除所有记录并尝试插入新记录,则将使用AUTO_INCREMENT值。所以新的id将是11。您可以通过更改表格来更新它

ALTER TABLE <tablename> AUTO_INCREMENT = 1;