Использование AUTO_INCREMENT в MYSQL - PullRequest
0 голосов
/ 24 декабря 2009

Почему я получаю следующее исключение, когда я сделал это, какую ошибку я сделал? Как правильно вставить кортеж в таблицы с полями 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());
}  

1004 *

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 ]

3 голосов
/ 24 декабря 2009

Эти строки являются проблемой:

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 из-за предыдущей вставленной строки. Итак, на этот раз уже есть строка с 1 в БД, и вторая вставка не удалась из-за дубликата 1.

Переписать так:

string s1 = "INSERT INTO school.student (name) VALUES (\'john\' )";
string s2 = "INSERT INTO school.student (name) VALUES (\'mary\' )";
0 голосов
/ 24 декабря 2009

Вы не должны пытаться вставить значение в поле автоинкремента - поскольку (подсказка в имени) оно будет автоматически увеличено MySQL.

0 голосов
/ 24 декабря 2009

Просто опустите поле с AUTO_INCREMENT, MySQL позаботится обо всем остальном. Вы можете обновить идентификаторы после УДАЛИТЬ, но я бы посоветовал вам этого не делать.

...