Вставить в поле автоматического увеличения

#mysql

#mysql

Вопрос:

у меня есть таблица, в которой я запустил идентификатор автоматического увеличения на 10000, так что у меня есть 10000 значений, зарезервированных для ручной вставки значений от администраторов. Однако при выполнении вставки в MyTable (ID, имя, значение) ЗНАЧЕНИЙ (500, «Test», «Test») я делаю select, и он игнорирует мой идентификатор, который я ему дал, и помещает в следующий диапазон 10000. Есть предложения по исправлению этого или что может быть не так? Приведенный выше код, конечно, псевдо, но я могу привести реальный пример кода, если это не имеет смысла.

Ответ №1:

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

Ваш идентификатор auto_incremented является первичным ключом. Первичный ключ используется для уникальной идентификации строки в таблице. Вот и все. Это не имеет никакого другого специального значения, кроме этого.

Итак, что это значит для вас? Это означает, что ваша идея о том, что вы будете «резервировать» 1-10 кб для администраторов, плоха. Почему это плохо? Потому что вы подделываете первичный ключ. Вы никогда не должны решать, каким должно быть значение первичного ключа, это работа баз данных по многим причинам (например, согласованность). Другая причина, по которой это плохо, заключается в том, что вы ограничили кого-то всего 10 тысячами возможных записей. С другой стороны, как вы будете вычислять, какой будет следующая запись для администраторов? Что, если вы ввели 1, 2, 3, 4, а затем удалили запись с ID = 3? Что происходит тогда? Какое у вас следующее значение в последовательности? 3 или 5?

Сказав это, вам, вероятно, следует пересмотреть свою стратегию. Почему бы не добавить поле «isAdmin», которое сообщит вам, опубликовал ли администратор что-либо или нет?

Комментарии:

1. Вы сказали, что в конечном итоге ответите на вопрос, и вы так и не ответили:-P