为什么当我使用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();
}
}
}
答案 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;