4

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();
        }
    }
  }
4

5 に答える 5

3

自動インクリメント値は、トランザクション内に行を挿入してから、トランザクションからバックアウトすることによっても影響を受ける可能性があります。

auto_incrementmysqlの値はいつでも直接リセットできます。

alter table <tablename> auto_increment = <some_number>;

しかし、正直なところ、それは何が重要なのでしょうか?値は一意である必要がありますが、順序を示すものであってはなりません。

于 2012-04-03T20:24:34.210 に答える
3
ALTER TABLE Owner AUTO_INCREMENT = 1;
于 2016-01-28T06:41:14.830 に答える
2

私が知っているシナリオは2つだけです。

(1)一部のレコードが削除されました

(2)そのようなIDを変更するトリガーがテーブルにあります

空のテーブルに新たに挿入した場合でも、以前にいくつかの行があった場合、テーブルを空にしても自動インクリメントIDカウンターはリセットされず、テーブル内の実際のレコードの数ではなく、最後に発行された番号から順番に続行されることに注意してください。 ..

于 2012-04-03T20:26:04.163 に答える
2

ほとんどの場合、以前にテーブルDog / Ownerから行を削除したため、自動増分数が増加しました。リセットする必要があります(または、これらのテーブルに対してDROP / CREATEを実行して、データを再挿入します)。

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

同じことを達成するためのさらに別の方法は、切り捨てを実行することです。

TRUNCATE Dog;
TRUNCATE OWNER;

これにより、データが削除され、インデックスがリセットされます。

于 2012-04-03T20:21:33.843 に答える
1

新しく挿入されたレコードのIDであるAUTO_INCREMENT変数があります。10個のレコードを挿入した場合、AUTO_INCREMENTは11に設定されます。テーブルからすべてのレコードを削除して新しいレコードを挿入しようとすると、AUTO_INCREMENT値が使用されます。したがって、新しいIDは11になります。テーブルを変更して更新できます

ALTER TABLE <tablename> AUTO_INCREMENT = 1;
于 2015-06-11T07:26:32.173 に答える