Подтвердить что ты не робот

Как переопределить атрибуцию автоматического приращения первичного ключа при вставке значения в таблицу MySQL?

У меня есть таблица MySQL пользователей, чей первичный ключ является автоматически увеличивающимся целым числом. В таблице уже записаны записи с ключом от 0 до 30 000. Однако не все записи. Некоторые пользователи были удалены, и поэтому у меня есть "дыры".

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

На данный момент я:

  • изменить структуру таблицы, удалив свойство auto_increment из идентификатора
  • добавить нужные мне записи, указав их идентификатор
  • возврат изменений в структуру таблицы.

Есть ли лучший способ достичь этого? Есть ли какая-либо функция SQL override, которая позволила бы мне заставить MySQL принять значение, которое является уникальным, но не обязательно "следующим числом в строке"?

4b9b3361

Ответ 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.