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

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

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

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

  1. изменение структуры таблицы путем удаления свойства auto_increment из идентификатора
  2. добавление нужных мне записей с указанием их ID
  3. Возврат изменений в структуру таблицы.

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

5 ответов

Решение

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

РЕДАКТИРОВАТЬ: Я думал, что мог бы привести примеры для этого:

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)

У меня была похожая проблема. Я обнаружил, что вы можете установить идентификатор для любого числа в обновлении, хотя вы не можете установить его ниже текущего минимума во вставке. Чтобы обойти это, я написал скрипт, который преобразовывал мои данные импорта в серию операторов 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-код для получения наибольшего идентификатора и обновить его до правильного идентификатора перед вставкой следующей записи. Надеюсь, это поможет!

Чтобы избежать проблем с реализацией AUTO_INCREMENT (или полей идентификации в любой базе данных), я никогда не использую его, когда что-то вне базы данных (человек или система) должно знать о значениях.

Документация MySQL гласит:

Атрибут AUTO_INCREMENT может использоваться для генерации уникального идентификатора для новых строк.

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

Возможно, используемый вами драйвер считывает схему таблицы и адаптируется к ней. Когда он видит auto_increment столбец пропускает свое значение. Это в случае с C# DataAdapter, как в генерации оператора вставки, который включает в себя столбец идентичности.

Так как они сказали DataAdapter не может быть настроен, и единственный вариант - использовать руководство insert команда.

Я нашел это здесь, потому что у меня такая же проблема. Даже это старше, может быть, это кому-то поможет.

Автоинкремент действует только на НОВЫЕ вставленные роли. Невозможно установить новую роль с заданным значением, которое меньше текущего максимального значения приращения в таблице.

Чтобы решить эту проблему, просто вставьте новую строку (и дайте автоинкременту установить значение), а затем просто измените это значение!(если значение не используется, оно будет работать)

untestet: возможно, это также может решить проблему, если вы сбросите счетчик автоинкремента

Другие вопросы по тегам