Ваш коллега неправ, и это - то же для 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
Автоинкремент будет использовать следующий доступный идентификатор для таблиц 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 с тем же результатом.
Автоинкремент будет использовать следующий доступный идентификатор для таблиц InnoDB и MyISAM, но вы можете вручную изменить его следующую позицию следующим образом:
После вставки вы можете установить автоинкремент на значение выше текущего наивысшего идентификатора:
ALTER TABLE tbl AUTO_INCREMENT = 9000;
Если у вас есть только одна устаревшая таблица без зависимостей от идентификаторов, то я бы создал временную таблицу для вставки всех ваших новых данных (с идентификаторами 5000+). Затем запустите это:
INSERT INTO `myrealtable` (column1, column2, column3)
SELECT column1, column2, column3
FROM `temptable`;
DROP TABLE `temptable`;
... где ни один из столбцов columnX не является основным идентификатором auto_increment.
Я считаю, что MySQL проверяет, вставляете ли вы автоматически увеличивающийся столбец, и обновляет AUTO_INCREMENT так, чтобы AUTO_INCREMENT> MAX (id), но мне нужно просмотреть документы. Вы все равно должны следовать совету Эндрю Даффи, на всякий случай.
MySQL не позволяет вам устанавливать внутреннее "значение" auto_increment ниже, чем текущий наивысший идентификатор.
Следовательно, если вы добавляете 1000 строк, начиная с 5000, приращение устанавливается на 6000. Вы все еще можете добавлять строки с идентификаторами, которых еще нет (например, 4500), но на самом деле не стоит беспокоиться. Существует множество чисел от 6000 до 4 миллиардов.
Если вы вставляете данные с уже назначенными первичными ключами в MyISAM, значение столбца AUTO_INCREMENT для следующая вставка будет max (column) + 1, поэтому она будет работать.
Однако вы не используете MyISAM, поскольку это важные данные, вы используете InnoDB, для которого требуется приведенный выше оператор ALTER TABLE.