Автоинкремент после удаления в MySQL - PullRequest
62 голосов
/ 06 февраля 2010

У меня есть таблица MySQL с полем первичного ключа с включенным AUTO_INCREMENT. Прочитав другие посты здесь, я заметил людей с такой же проблемой и с разными ответами. Некоторые рекомендуют не использовать эту функцию, другие утверждают, что ее нельзя «исправить».

У меня есть:

table: course
fields: courseID, courseName

Пример: количество записей в таблице: 18. Если я удалю записи 16, 17 и 18 - я ожидаю, что следующая введенная запись будет иметь идентификатор курса из 16, однако это будет 19, поскольку последний введенный идентификатор курса был 18 .

Мои знания SQL не удивительны, но есть ли возможность обновить или обновить это количество с помощью запроса (или параметра в интерфейсе phpMyAdmin)?

Эта таблица будет относиться к другим в базе данных.


Учитывая все советы, я решил проигнорировать эту «проблему». Я просто удаляю и добавляю записи, пока автоинкремент выполняет свою работу. Я думаю, что на самом деле не имеет значения, что это за номер, поскольку он используется только в качестве уникального идентификатора и не имеет (как упоминалось выше) business значения.

Для тех, кого я, возможно, перепутал с моим оригинальным постом: я не хочу использовать это поле, чтобы знать, сколько у меня записей. Я просто хотел, чтобы база данных выглядела аккуратно и была более согласованной.

Ответы [ 16 ]

0 голосов
/ 10 ноября 2017

вот функция, которая решит вашу проблему

    public static void fixID(Connection conn, String table) {

    try {
        Statement myStmt = conn.createStatement();
        ResultSet myRs;
        int i = 1, id = 1, n = 0;
        boolean b;
        String sql;

        myRs = myStmt.executeQuery("select max(id) from " + table);
        if (myRs.next()) {
            n = myRs.getInt(1);
        }
        while (i <= n) {
            b = false;
            myRs = null;
            while (!b) {
                myRs = myStmt.executeQuery("select id from " + table + " where id=" + id);
                if (!myRs.next()) {
                    id++;
                } else {
                    b = true;
                }
            }

            sql = "UPDATE " + table + " set id =" + i + " WHERE id=" + id;
            myStmt.execute(sql);
            i++;
            id++;
        }

    } catch (SQLException e) {
        e.printStackTrace();
    }
}
0 голосов
/ 19 июня 2017

Это определенно не рекомендуется. Если у вас большая база данных с несколькими таблицами, возможно, вы сохранили идентификатор пользователя в качестве идентификатора в таблице 2. Если вы переставите таблицу 1, то, вероятно, предполагаемый идентификатор пользователя не будет в конечном итоге идентифицированным идентификатором таблицы 2.

0 голосов
/ 06 апреля 2017

Можно подумать о создании триггера после удаления, чтобы можно было обновить значение автоинкремента и значение идентификатора всех строк, которые не выглядят так, как вы хотели.

Таким образом, вы можете работать с одной и той же таблицей, и автоинкремент будет автоматически фиксироваться всякий раз, когда вы удаляете строку, триггер это исправит.

0 голосов
/ 17 марта 2017
if($id == 1){ // deleting first row
            mysqli_query($db,"UPDATE employees  SET id=id-1 WHERE id>1");
        }
        else if($id>1 && $id<$num){ // deleting middle row
            mysqli_query($db,"UPDATE employees  SET id=id-1 WHERE id>$id");
        }
        else if($id == $num){ // deleting last row
            mysqli_query($db,"ALTER TABLE employees AUTO_INCREMENT = $num");
        }
        else{
            echo "ERROR";
        }

        mysqli_query($db,"ALTER TABLE employees AUTO_INCREMENT = $num");
0 голосов
/ 19 апреля 2015

То, что вы пытаетесь сделать, очень опасно.Подумай об этом внимательно.Существует очень веская причина по умолчанию для автоматического приращения.

Учитывайте следующее:

Запись удаляется в одной таблице, которая связана с другой таблицей.Соответствующая запись во второй таблице не может быть удалена по причинам аудита.Эта запись становится осиротевшей из первой таблицы.Если новая запись вставлена ​​в первую таблицу, и используется последовательный первичный ключ, эта запись теперь связана с сиротой.Очевидно, это плохо.При использовании PK с автоматическим увеличением всегда гарантируется идентификатор, который никогда не использовался ранее.Это означает, что сироты остаются сиротами, и это правильно.

0 голосов
/ 06 февраля 2010

Вы можете использовать клиентское программное обеспечение / скрипт mysql, чтобы указать, с чего должен начинаться первичный ключ после удаления необходимых записей.

...