Как переопределить атрибуцию автоматического приращения первичного ключа при вставке значения в таблицу MySQL?
У меня есть таблица MySQL пользователей, чей первичный ключ является автоматически увеличивающимся целым числом. В таблице уже записаны записи с ключом от 0 до 30 000. Однако не все записи. Некоторые пользователи были удалены, и поэтому у меня есть "дыры".
Теперь клиент понял, что они удалили кучу пользователей по ошибке, и теперь они хотят, чтобы я снова вставлял тех пользователей, которые сохраняли тот же идентификатор, который у них был, для совместимости с внутренним контентом электронной коммерции, который работает на другой машины, но использует тот же идентификатор для клиентов.
На данный момент я:
- изменить структуру таблицы, удалив свойство auto_increment из идентификатора
- добавить нужные мне записи, указав их идентификатор
- возврат изменений в структуру таблицы.
Есть ли лучший способ достичь этого? Есть ли какая-либо функция SQL override
, которая позволила бы мне заставить MySQL принять значение, которое является уникальным, но не обязательно "следующим числом в строке"?
Ответы
Ответ 1
Вам не нужно отключать функцию auto_increment
. Когда вы вставляете строку в таблицу, и вы указываете значение первичного ключа в строке, нужный вам идентификатор сохраняется в базе данных. auto_increment
используется только при опускании поля первичного ключа.
EDIT: Я думал, что могу привести примеры для этого:
mysql> describe test;
+-------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| value | varchar(45) | NO | | NULL | |
+-------+------------------+------+-----+---------+----------------+
2 rows in set (0.02 sec)
mysql> insert into test (value) values ('row 1');
Query OK, 1 row affected (0.06 sec)
mysql> select * from test;
+----+-------+
| id | value |
+----+-------+
| 1 | row 1 |
+----+-------+
1 row in set (0.00 sec)
mysql> insert into test values (15, 'row 2');
Query OK, 1 row affected (0.03 sec)
mysql> select * from test;
+----+-------+
| id | value |
+----+-------+
| 1 | row 1 |
| 15 | row 2 |
+----+-------+
2 rows in set (0.00 sec)
РЕДАКТИРОВАТЬ 2
mysql> insert into test (id, value) values (3, 'row 3');
Query OK, 1 row affected (0.00 sec)
mysql> select * from test;
+----+-------+
| id | value |
+----+-------+
| 1 | row 1 |
| 15 | row 2 |
| 3 | row 3 |
+----+-------+
3 rows in set (0.00 sec)
Ответ 2
Чтобы избежать проблем с реализацией AUTO_INCREMENT (или полей идентификации в любой базе данных), я никогда не использую его, когда что-то вне базы данных (как человека, так и системы) должно знать о значениях.
Документация по MySQL говорит:
Атрибут AUTO_INCREMENT может быть используется для создания уникального идентификатора для новые строки.
По-моему, это все, о чем вы должны заботиться. Числа есть, и они уникальны. Не обращайте внимания на то, что они есть, и если у них "пробелы" или "дыры". Если вы хотите видеть видимые извне, возможно, какой-то GUID будет лучше.
Ответ 3
У меня была аналогичная проблема. Я обнаружил, что вы можете установить ID на любой номер в обновлении, хотя вы не можете установить его ниже текущего минимума в вставке. Чтобы обойти это, я написал script, который преобразовал мои данные импорта в ряд операторов SQL с парой, которая для каждой строки данных выглядела следующим образом:
// This inserts the record with the next auto_increment id<br />
INSERT INTO mytable (ID, NAME, OTHER_COL...) VALUES (17, 'UNIQUE VALUE', 'other value'...);<br />
// This sets the correct ID on the newly inserted record<br />
UPDATE mytable SET ID=17 WHERE NAME='UNIQUE VALUE';
Если у вас нет уникального поля, вы можете написать SQL, чтобы получить самый большой идентификатор и обновить его до правильного идентификатора, прежде чем вставлять следующую запись. Надеюсь, это поможет!
Ответ 4
Возможно, что используемый вами драйвер считывает схему таблицы и адаптируется к ней. Когда он видит столбец auto_increment
, он пропускает его значение. Это имеет место с С# DataAdapter
, как в Создание инструкции insert, которая включает столбец идентификаторов.
Как говорится DataAdapter
невозможно настроить, и единственная опция - использовать ручную команду insert
.