萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> Mysql設置自增長主鍵的初始值

Mysql設置自增長主鍵的初始值

本文章是由一個簡單的Mysql自增初始值的一個例子引導出大量的關於mysql主鍵獲取 修改及一些常用的例子,下面我們一起來看看希望例子對各位會有幫助。

alter table table_name auto_increment=n;
注意n只能大於已有的auto_increment的整數值,小於的值無效.
show table status like 'table_name' 可以看到auto_increment這一列是表現有的值.
步進值沒法改變.只能通過下面提到last_inset_id()函數變通使用

Mysql可以使用AUTO_INCREMENT來設定主鍵的值為自增長的,其默認值是1,如果想把它的初始值設置為1000,比較笨的辦法是先插入一條記錄並指定主鍵的值為999,然後delete改行記錄,例如:

 代碼如下 復制代碼

insert into test(pk) values(999);
delete from test where pk = 999;

更好的方法是使用alter的方法來直接修改,例如:

 代碼如下 復制代碼

alter table test AUTO_INCREMENT = 1000;

例子

1、不控制主鍵的起點

 代碼如下 復制代碼 create table emb_t_dictBusType
(
   emb_c_busTypeID      int not null auto_increment,
   emb_c_busTypeEnName  varchar(255) not null,
   emb_c_busTypeZhName  varchar(255) not null,
   primary key(emb_c_busTypeID) 
)engine=INNODB  default charset=gbk;

2、控制主鍵的起點

 代碼如下 復制代碼

create table emb_t_dictBusType
(
   emb_c_busTypeID      int not null auto_increment,
   emb_c_busTypeEnName  varchar(255) not null,
   emb_c_busTypeZhName  varchar(255) not null,
   primary key(emb_c_busTypeID) 
)engine=INNODB auto_increment=1001 default charset=gbk;

自增主鍵歸零

方法一:


如果曾經的數據都不需要的話,可以直接清空所有數據,並將自增字段恢復從1開始計數
truncate table 表名

方法二:


dbcc checkident (’table_name’, reseed, new_reseed_value) 當前值設置為 new_reseed_value。如果自創建表後沒有將行插入該表,則在執行 DBCC CHECKIDENT 後插入的第一行將使用 new_reseed_value 作為標識。否則,下一個插入的行將使用 new_reseed_value + 1。如果 new_reseed_value 的值小於標識列中的最大值,以後引用該表時將產生 2627 號錯誤信息。 www.111cn.net
方法二不會清空已有數據,操作比較靈活,不僅可以將自增值歸零,也適用於刪除大量連續行後,重新設置自增值並插入新的數據;或從新的值開始,當然不能和已有的沖突。

 代碼如下 復制代碼

$sql="delete from $table_vote";
mysql_query($sql, $link);
$sql="alter table $table_vote auto_increment=1";
mysql_query($sql, $link);


獲取自增主鍵【4種方法】

通常我們在應用中對mysql執行了insert操作後,需要獲取插入記錄的自增主鍵。本文將介紹java環境下的4種方法獲取insert後的記錄主鍵auto_increment的值:

通過JDBC2.0提供的insertRow()方式
通過JDBC3.0提供的getGeneratedKeys()方式
通過SQL select LAST_INSERT_ID()函數
通過SQL @@IDENTITY 變量


1. 通過JDBC2.0提供的insertRow()方式
自jdbc2.0以來,可以通過下面的方式執行。

 代碼如下 復制代碼

Statement stmt = null;
ResultSet rs = null;
try {
    stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,  // 創建Statement
                                java.sql.ResultSet.CONCUR_UPDATABLE);
    stmt.executeUpdate("DROP TABLE IF EXISTS autoIncTutorial");
    stmt.executeUpdate(                                                // 創建demo表
            "CREATE TABLE autoIncTutorial ("
            + "priKey INT NOT NULL AUTO_INCREMENT, "
            + "dataField VARCHAR(64), PRIMARY KEY (priKey))");
    rs = stmt.executeQuery("SELECT priKey, dataField "                 // 檢索數據
       + "FROM autoIncTutorial");
    rs.moveToInsertRow();                                              // 移動游標到待插入行(未創建的偽記錄)
    rs.updateString("dataField", "AUTO INCREMENT here?");              // 修改內容
    rs.insertRow();                                                    // 插入記錄
    rs.last();                                                         // 移動游標到最後一行
    int autoIncKeyFromRS = rs.getInt("priKey");                        // 獲取剛插入記錄的主鍵preKey
    rs.close();
    rs = null;
    System.out.println("Key returned for inserted row: "
        + autoIncKeyFromRS);
}  finally {
    // rs,stmt的close()清理
}

2. 通過JDBC3.0提供的getGeneratedKeys()方式

 

 代碼如下 復制代碼 Statement stmt = null;
ResultSet rs = null;
try {
    stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
                                java.sql.ResultSet.CONCUR_UPDATABLE); 
    // ...
    // 省略若干行(如上例般創建demo表)
    // ... www.111cn.net
    stmt.executeUpdate(
            "INSERT INTO autoIncTutorial (dataField) "
            + "values ('Can I Get the Auto Increment Field?')",
            Statement.RETURN_GENERATED_KEYS);                      // 向驅動指明需要自動獲取generatedKeys!
    int autoIncKeyFromApi = -1;
    rs = stmt.getGeneratedKeys();                                  // 獲取自增主鍵!
    if (rs.next()) {
        autoIncKeyFromApi = rs.getInt(1);
    }  else {
        // throw an exception from here
    }
    rs.close();
    rs = null;
    System.out.println("Key returned from getGeneratedKeys():"
        + autoIncKeyFromApi);
}  finally { ... }

使用AUTO_INCREMENT時,應注意以下幾點:

AUTO_INCREMENT是數據列的一種屬性,只適用於整數類型數據列。

設置AUTO_INCREMENT屬性的數據列應該是一個正數序列,所以應該把該數據列聲明為UNSIGNED,這樣序列的編號個可增加一倍。

AUTO_INCREMENT數據列必須有唯一索引,以避免序號重復。

AUTO_INCREMENT數據列必須具備NOT NULL屬性。

AUTO_INCREMENT數據列序號的最大值受該列的數據類型約束,如TINYINT數據列的最大編號是127,如加上UNSIGNED,則最大為255。一旦達到上限,AUTO_INCREMENT就會失效。

copyright © 萬盛學電腦網 all rights reserved