MySQL - Вмъкване на ред без прекъсване на AUTO_INCREMENT

Бърз въпрос:

Имам база данни на спортната лига със списък от игри (да кажем около 40). На всяка игра автоматично се присвоява идентификационен номер като първичен ключ при импортиране на целия график от електронна таблица. След това игрите се показват на уеб страницата в низходящ ред благодарение на този невидим (за потребителя) първичен ключ. Ето един пример: График на лигата

Работи чудесно. Единственият проблем е, че понякога игрите се пренасрочват и преместват на по-късна дата или се добавя нова игра и трябва да се вмъкне във вече съществуващ график. До този момент трябваше ръчно да редактирам идентификатора на всеки засегнат ред (с помощта на PhpMyAdmin), за да отчета промените и това може да бъде доста досадно и отнема много време.

Това, което наистина бих искал да направя, е да настроя таблицата да пренастройва стойностите на първичния ключ в движение. Което означава, че ако вмъкна чисто нова игра в петия ред на таблицата, всички игри след това автоматично ще бъдат пренастроени (ID 5 ще стане 6, ID 6 ще стане 7 и т.н.).

Има ли начин да настроя таблицата да прави това или конкретна SQL команда, която мога да използвам, за да го изпълня по същия начин? Извинения, ако това вече е задавано много пъти по различни начини. Всякакви отзиви се оценяват.


person 712Jefferson    schedule 23.09.2013    source източник


Отговори (2)


Не трябва да използвате своя ПРЪВИЧЕН КЛЮЧ за това. Добавете специална колона като sort с обикновен INDEX, а не UNIQUE. Не е задължително да е INT, можете да използвате реални числа. По този начин винаги ще можете да вмъкнете нов ред между всеки два реда от вашия график.

person Leo Nyx    schedule 23.09.2013

Не, изисква се автоматичното нарастване да бъде уникално, но не се изисква да е в конкретен ред или дори непрекъснато. Фактът, че автоматичното увеличение е монотонно нарастващо, е само поради съвпадението на неговото изпълнение. Не разчитайте стойностите да са в хронологичен ред.

Опитът да коригирате стойностите е не само ръчен и неудобен, но рискува състезателни условия, или иначе изискват заключване на много редове. Какво ще стане, ако вмъкнете ред с id 5, но вашата таблица има 1 милиард реда, по-големи от id 5?

Съществува и риск от преномериране на колони с първичен ключ, тъй като всеки потребител, който е получил имейл, който му казва, че трябва да отиде на игра 42, може в крайна сметка да отиде на грешната игра.

Ако трябва да прегледате редовете в определен ред (напр. хронологичен), тогава използвайте колона ДАТА за това, а не колона с автоматично нарастване.

person Bill Karwin    schedule 23.09.2013
comment
Какво ще стане, ако вмъкнете ред с id 5, но вашата таблица има 1 милиард реда, по-големи от id 5? Точно.. каква болка в задника! Много благодаря за полезните отзиви. - person 712Jefferson; 23.09.2013