Что происходит, когда автоинкремент сталкивается с существующими данными в MySQL?

Ваш коллега неправ, и это - то же для C и C++. Попробуйте следующее:

typedef struct foo_t {
    int i;
} foo_t;

int main()
{
    foo_t f = {123};
    const foo_t *p = &f;
    const foo_t **pp = &p;
    printf("f.i = %d\n", (*pp)->i);
    (*pp)->i = 888; // error
    p->i = 999;     // error
}

Visual C++ 2008 дает следующие ошибки для последних двух строк:

error C2166: l-value specifies const object
error C2166: l-value specifies const object

GCC 4 говорит:

error: assignment of read-only location '**pp'
error: assignment of read-only location '*p'

G ++ 4 говорит:

error: assignment of data-member 'foo_t::i' in read-only structure
error: assignment of data-member 'foo_t::i' in read-only structure
12
задан ctford 31 October 2009 в 12:50
поделиться

7 ответов

Автоинкремент будет использовать следующий доступный идентификатор для таблиц InnoDB и MyISAM.

Я тестировал это для MySQL 4.1.22, работающего в Windows Vista. Я создал две простые таблицы, одну с использованием InnoDB и одну с помощью MyISAM. У каждого был автоинкрементный первичный ключ с именем 'id' и столбец varchar с именем 'description'.

Я выполнил следующие команды (без ошибок):

INSERT INTO MyIsamTest (description)     VALUES ('autoincrement id insert'); 
INSERT INTO MyIsamTest (id, description) VALUES (100, 'manual id insert');
INSERT INTO MyIsamTest (description)     VALUES ('autoincrement id insert');

SELECT * FROM MyIsamTest;

Я получил следующий результат, который показывает, что столбец 'id' был правильно автоматически увеличен:

+=====+=========================+
| id  | description             |
+=====+=========================+
|   1 | autoincrement id insert |
+-----+-------------------------+
| 100 | manual id insert        |
+-----+-------------------------+
| 101 | autoincrement id insert |
+-----+-------------------------+

Я повторил эксперимент с моей таблицей InnoDbTest с тем же результатом.

6
ответ дан 2 December 2019 в 20:41
поделиться

Автоинкремент будет использовать следующий доступный идентификатор для таблиц InnoDB и MyISAM, но вы можете вручную изменить его следующую позицию следующим образом:

После вставки вы можете установить автоинкремент на значение выше текущего наивысшего идентификатора:

ALTER TABLE tbl AUTO_INCREMENT = 9000;
9
ответ дан 2 December 2019 в 20:41
поделиться

Я использую:

  • Eclipse в качестве IDE
  • Toby '
0
ответ дан 2 December 2019 в 20:41
поделиться

Если у вас есть только одна устаревшая таблица без зависимостей от идентификаторов, то я бы создал временную таблицу для вставки всех ваших новых данных (с идентификаторами 5000+). Затем запустите это:

INSERT INTO `myrealtable` (column1, column2, column3)
SELECT column1, column2, column3
FROM `temptable`;

DROP TABLE `temptable`;

... где ни один из столбцов columnX не является основным идентификатором auto_increment.

0
ответ дан 2 December 2019 в 20:41
поделиться

Я считаю, что MySQL проверяет, вставляете ли вы автоматически увеличивающийся столбец, и обновляет AUTO_INCREMENT так, чтобы AUTO_INCREMENT> MAX (id), но мне нужно просмотреть документы. Вы все равно должны следовать совету Эндрю Даффи, на всякий случай.

0
ответ дан 2 December 2019 в 20:41
поделиться

MySQL не позволяет вам устанавливать внутреннее "значение" auto_increment ниже, чем текущий наивысший идентификатор.

Следовательно, если вы добавляете 1000 строк, начиная с 5000, приращение устанавливается на 6000. Вы все еще можете добавлять строки с идентификаторами, которых еще нет (например, 4500), но на самом деле не стоит беспокоиться. Существует множество чисел от 6000 до 4 миллиардов.

0
ответ дан 2 December 2019 в 20:41
поделиться

Если вы вставляете данные с уже назначенными первичными ключами в MyISAM, значение столбца AUTO_INCREMENT для следующая вставка будет max (column) + 1, поэтому она будет работать.

Однако вы не используете MyISAM, поскольку это важные данные, вы используете InnoDB, для которого требуется приведенный выше оператор ALTER TABLE.

0
ответ дан 2 December 2019 в 20:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: