как отключить автономер в sql? - PullRequest
2 голосов
/ 27 января 2012

У меня дилемма.У меня есть таблица со столбцом с именем ID, и это первичный ключ.Это в автоматических приращениях так 1, 2, 3, и так далее, и таблица 1-8.

Бывший программист удалил строку 7, и теперь между 6 и 8 есть разрыв. Мне нужно изменить значение с 8 на 7.

Я пробовал несколько вещей:

  • Я не могу отредактировать идентификатор 8, потому что это столбец идентификаторов

  • Я попытался выполнить запрос:

    установить identity_insert mytable ON

затем удалите строку и повторно добавьте и измените идентификатор, как рекомендовали другие темы.Тем не менее, автоматическое число вступило в силу, и теперь это строка 9, и я до сих пор не могу изменить идентификатор.Я не уверен, что я делаю не так здесь.Есть ли способ сделать это?Заранее спасибо.

Ответы [ 5 ]

2 голосов
/ 27 января 2012

Вам, вероятно, нужно спросить , почему важно, чтобы числа были последовательными без пробелов: тип SQL IDENTITY на самом деле не для такой функциональности, как вы выяснили.

Тем не менее, если вам нужно заполнить пропуски, вы почти у цели - еще одна вещь, которую вам нужно сделать, это заново заполнить поле идентификатора новым начальным номером. В SQL Server это достигается с помощью DBCC CHECKIDENT.

Не делайте эту программную вещь запущенной - это должно быть задачей администратора баз данных только тогда, когда вам нужно очистить данные, и это будет довольно редко на практике (через десять лет я только когда-либо Я использовал его один раз. И это было в базе данных разработчика; он никогда не использовался в реальных средах). Если вы обнаружите, что вы регулярно перезаряжаете, вам нужно переосмыслить поведение приложения.

1 голос
/ 12 марта 2012

Никто на самом деле не ответил на вопрос: «Как отключить автонумерацию в sql?»

PhpMyAmin показывает следующий SQL, когда я изменяю целочисленное поле на autonum ...

ALTER TABLE course CHANGE Test Test INT (11) NOT NULL AUTO_INCREMENT

.. и это когда я удаляю автонум ...

ALTER TABLE course CHANGE Test Test INT (11) NOT NULL

В MS ACCESS SQL я использовал

курс ALTER TABLE ALTER Record_ID INTEGER; чтобы отключить автоматический номер.

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

Может быть, это поможет следующему человеку, который приземлится здесь.

0 голосов
/ 10 марта 2014

Есть допустимые случаи (но плохой / несовершенный дизайн БД), где это применимо.

например. таблица с низким числом строк, но очень быстро перемещается вверх по идентификаторам. Вы можете нажать целое число max + ve.

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

0 голосов
/ 27 января 2012

Я не уверен, что я делаю здесь неправильно.

Вы используете IDENTITY для чего-то другого, чем предполагалось.

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

В общем случае почти никогда не стоит менять значение первичного ключа (независимо от того, является ли он столбцом IDENTITY или просто "обычным" первичным ключом).

Просто подумайте об этих сценариях:

  • Что вы делаете, когда есть другие таблицы, которые ссылаются на таблицу, которую вы меняете?
    Вам нужно найти все другие таблицы, в которых используется значение, и изменить его там.
    (представьте себе таблицу Products с таблицей ProductId, плюс таблицу Orders, в которой также используется тот же ProductId)

  • Что вы делаете, когда в базе уже есть 100 000 записей и затем кто-то удаляет строку 7? Измените значения в строке 8 на 100 000?

  • Затем представьте, что строка 7 из 100 000 удалена и , что столбец ссылается на другие таблицы.

  • Вы действительно хотите делать это каждый раз, когда кто-то удаляет строку?

Видите ли, у парней из Microsoft была причина, когда они решили не разрешать редактировать IDENTITY значения.
Ты НЕ хочешь этого делать ... поверь мне!

0 голосов
/ 27 января 2012

Попробуйте найти пропущенные пробелы и вставьте, используя этот идентификатор.Это может оказаться полезным и достаточно хорошо объяснено http://www.codediesel.com/mysql/sequence-gaps-in-mysql/

...