2009-12-24 62 views
0

爲什麼當我這樣做時發生以下異常,我犯了什麼錯誤? 將元組插入帶AUTO_INCREMENT字段的表的正確方法是什麼? 如何刪除,是否可以更新ID?在MYSQL中使用AUTO_INCREMENT

string connStr = "server=localhost;user=root;database=test;port=3306;password=XXX;"; 
MySqlConnection conn = new MySqlConnection(connStr); 
try{ 
    MessageBox.Show("Hello"); 
    conn.Open(); 
    string s0 = "CREATE TABLE school.student (id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, name VARCHAR(45) NOT NULL, PRIMARY KEY (id))"; 
    string s1 = "INSERT INTO school.student VALUES (LAST_INSERT_ID(), \'john\')"; 
    string s2 = "INSERT INTO school.student VALUES (LAST_INSERT_ID(), \'mary\')"; 
    MySqlCommand cmd = new MySqlCommand(s0, conn); 
    cmd.ExecuteNonQuery();       
    cmd = new MySqlCommand(s1, conn); 
    cmd.ExecuteNonQuery();       
    cmd = new MySqlCommand(s2, conn); 
    cmd.ExecuteNonQuery(); 
    conn.Close(); 
}catch(Exception ex){ 
    TextWriter tw = new StreamWriter("C:\\test.txt"); 
    MessageBox.Show(ex.ToString()); 
    tw.WriteLine(ex.ToString()); 
} 

MySql.Data.MySqlClient.MySqlException: Duplicate entry '1' for key 'PRIMARY' 
    at MySql.Data.MySqlClient.MySqlStream.ReadPacket() 
    at MySql.Data.MySqlClient.NativeDriver.ReadResult() 
    at MySql.Data.MySqlClient.ResultSet.NextResult() 
    at MySql.Data.MySqlClient.MySqlDataReader.NextResult() 
    at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior) 
    at MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery() 
    at ProjectInfo.Connect.Exec(String commandName, vsCommandExecOption executeOption, Object& varIn, Object& varOut, Boolean& handled) 

回答

3

這些行是該問題:

string s1 = "INSERT INTO school.student VALUES (LAST_INSERT_ID(), \'john\')"; 
string s2 = "INSERT INTO school.student VALUES (LAST_INSERT_ID(), \'mary\')"; 

看到,LAST_INSERT_ID()函數返回最後生成的AUTO_INCREMENT值的值。在第一次插入時,還沒有發生插入,並且LAST_INSERT_ID()的計算結果爲NULL。假設你的表是空的,插入的行的生成值爲1.在第二次插入時,由於插入了上一行,LAST_INSERT_ID()將爲1。所以,這個時候,已經有在DB與1行,因爲重複的1

重寫這樣的二次插入不會成功:

string s1 = "INSERT INTO school.student (name) VALUES (\'john\')"; 
string s2 = "INSERT INTO school.student (name) VALUES (\'mary\')"; 
+0

THX。我後來發現你也可以這樣做: string s1 =「INSERT INTO projectinfo.student VALUES(NULL,\'john \')」; string s2 =「INSERT INTO projectinfo.student VALUES(NULL,\'mary \')」; – yeeen 2010-01-02 16:59:03

+0

是的,你也可以這樣做,你甚至可以通過執行SELECT * FROM [tab] WHERE [auto inc column] IS NULL來選擇新插入的記錄。 但是,爲了清晰明瞭,我建議不要這樣做。國際海事組織只是奇怪你明確地分配NULL,但實際上得到一個新生成的值,而不是。 – 2010-01-02 19:02:45

0

只是省略了AUTO_INCREMENT領域,MySQL將採取其他的事情。 您可以在刪除後更新ID,但我會建議您不要那樣做。

0

你不應該試圖在自動增量字段中插入一個值,因爲(提示在名字中),這將被MySQL自動增加。