Перенумерация столбца идентификации - PullRequest
0 голосов
/ 20 ноября 2010

У меня есть таблица, в которой я установил один столбец (N) как «идентичность», поэтому он может увеличиваться на 1 каждый раз, когда я что-то добавляю в таблицу. Как изменить порядок N при удалении строки?

Например, если я добавлю 5 вещей в таблицу, N пойдет 1,2,3,4,5. Но если я удалю строку 3, N будет 1,2,4,5. Я хочу, чтобы он автоматически менял значения, чтобы N набрал 1,2,3,4.

Ответы [ 5 ]

9 голосов
/ 20 ноября 2010

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

0 голосов
/ 24 ноября 2010

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

Теперь иногда клиент просит об этом, и правильное действие - сказать: «Нет, это плохая идея. Это будет стоить вам значительно дороже в затратах на разработку и обслуживание, это значительно увеличит ваш рискданные не совпадают с неправильной записью, и это значительно увеличит ваш риск поиска новой записи, не связанной с проблемой, при исследовании чего-то из прошлого, которое ранее использовало число ».(подумайте, например, о повторном использовании номеров заказов, старый persson предоставил этот номер заказа и звонит, чтобы спросить об этом, но вы удалили его, и чей-то заказ находится на своем месте.)точно ничегоПрактически нет обстоятельств, когда вы действительно не можете пропустить записи, кроме нескольких навязчиво-компульсивных менеджеров, которые не хотят видеть пробелы.Даже они обычно сдаются, как только вы объясняете им, что процесс с большей вероятностью вызовет ошибки и будет стоить значительно дороже.В большинстве случаев это самообязательное требование со стороны разработчика, и нет никакого повода вообще когда-либо делать это, если у вас нет клиента, которого нельзя убедить иначе.

0 голосов
/ 20 ноября 2010

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

0 голосов
/ 20 ноября 2010

Полагаю, это повлияет на производительность приложения.Если вам нужно переупорядочить все идентификаторы, то это должно быть сделано на
1) стороне кода (переупорядочить в таблице данных и отправить изменения) ИЛИ
2) стороне SQL (через триггеры / хранимые процедуры/ временные таблицы)

0 голосов
/ 20 ноября 2010

Вы могли бы сделать это, но это была бы ужасная идея.

Вместо этого лучше вообще не хранить этот номер в базе данных, так как этот номер связан не с данными в строках, а с порядком , в котором вы их хотите быть восстановленным. Лучшее решение - использовать столбец порядка сортировки (который может включать пробелы) и использовать ROW_NUMBER при выборе данных для динамического генерирования номеров строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...