2009-12-24 60 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自动增加。