Автоматический Инкремент после удаляет в MySQL

У меня есть таблица MySQL с полем первичного ключа, которое имеет AUTO_INCREMENT на. После того, чтобы читать другие сообщения на здесь я заметил людей с той же проблемой и с варьировавшимися ответами. Некоторые рекомендуют не использовать эту функцию, другие заявляют, что она не может быть 'зафиксирована'.

Я имею:

table: course
fields: courseID, courseName

Пример: количество записей в таблице: 18. Если бы я удаляю записи 16, 17 и 18 - я ожидал бы следующую запись, вводимую, чтобы иметь courseID 16, однако это будет 19, потому что последнее вошло, courseID равнялся 18.

Мое знание SQL не удивительно, но должно там так или иначе обновить или обновить это количество с запросом (или установка в интерфейсе phpMyAdmin)?

Эта таблица коснется других в базе данных.


Учитывая весь совет, я решил проигнорировать эту 'проблему'. Я просто удалю и добавлю записи, позволяя автоматическому инкременту сделать, это - задание. Я предполагаю, что действительно не имеет значения, что - число, так как это используется только в качестве уникального идентификатора и не имеет (как упомянуто выше) бизнес-значение.

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

64
задан halfer 16 July 2015 в 12:10
поделиться

6 ответов

Строго говоря, для работы в Java не требуется среда IDE. Я много кодировал на Java на протяжении более десяти лет (и много на других вещах более 25 лет), и я не очень люблю IDE. Возможно, этот неявный показатель моего возраста является частью вопроса: -) Это компромисс, как и все остальное.

Я подключу Stripes как хорошая простая рамка, но в основном это потому, что он относительно небольшой и ограниченный по объему. Большие рамки, такие как Spring, являются экосистемами «кухонной раковины», и изучение Java с одной из этих рамок может сгладить некоторые из сложных частей, но оставить другие основные аспекты загадочными. Опять же, это вопрос личных предпочтений.

Хорошо, что вокруг кто-то знает язык. О, и к этому пункту, подружитесь с документацией Java API. Когда идут платформы, Java API имеет свои взлеты и падения, но по большей части документация по крайней мере довольно тщательно и довольно точно.

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

-121--1119789-

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

А что касается вашей проблемы с DevIL, вам не нужно создавать библиотеки ilu или ilut, чтобы сделать DevIL работоспособным. Рекомендуется самостоятельно управлять объектами текстуры OpenGL, включая загрузку данных изображения на сторону OpenGL.

-121--3461054-

То, что вы пытаетесь сделать, звучит опасно, так как это не предназначено для использования AUTO _ INCREMENT .

Если вы действительно хотите найти наименьшее неиспользуемое значение ключа, не используйте AUTO _ INCREMENT и управляйте ключами вручную. Однако это НЕ рекомендуемая практика.

Сделайте шаг назад и спросите « Зачем вам нужно перерабатывать ключевые значения? » Не обеспечивают ли неподписанные INT (или BIGINT ) достаточно большое пространство для ключа?

Действительно ли Вы собираетесь иметь более 18 446 744 073 709 551 615 уникальных записей в течение всего срока действия Вашего приложения?

67
ответ дан 24 November 2019 в 15:48
поделиться

Вы не должны полагаться на AUTO_INCREMENT id, чтобы сказать вам, сколько записей у вас в таблице. Вы должны использовать SELECT COUNT(*) FROM course(*). Идентификаторы существуют для уникальной идентификации курса и могут быть использованы в качестве ссылок в других таблицах, поэтому вы не должны повторять идентификаторы и не должны сбрасывать поле автоинкремента.

4
ответ дан 24 November 2019 в 15:48
поделиться

вы можете выбрать идентификаторы следующим образом:

set @rank = 0;
select id, @rank:=@rank+1 from tbl order by id

результат представляет собой список идентификаторов и их позиции в последовательности.

вы также можете сбросить идентификаторы следующим образом:

set @rank = 0;
update tbl a join (select id, @rank:=@rank+1 as rank from tbl order by id) b
  on a.id = b.id set a.id = b.rank;

вы также можете просто распечатать первый неиспользуемый идентификатор следующим образом:

select min(id) as next_id from ((select a.id from (select 1 as id) a
  left join tbl b on a.id = b.id where b.id is null) union
  (select min(a.id) + 1 as id from tbl a left join tbl b on a.id+1 = b.id
  where b.id is null)) c;

после каждой вставки вы можете сбросить auto_increment:

alter table tbl auto_increment = 16

или явно установить значение идентификатора при вставке:

insert into tbl values (16, 'something');

обычно в этом нет необходимости, у вас есть count (*) и возможность создавать ранжирующий номер в ваших наборах результатов. типичный рейтинг может быть таким:

set @rank = 0;
select a.name, a.amount, b.rank from cust a,
  (select amount, @rank:=@rank+1 as rank from cust order by amount desc) b
  where a.amount = b.amount

клиентов, ранжированных по потраченной сумме.

2
ответ дан 24 November 2019 в 15:48
поделиться

Существует разница. При использовании представления Синхронизировать (Synchronize) обновляются только элементы в представлении. С помощью Subversion папки также имеют редакцию, которая создается каждый раз при изменении нижестоящего элемента. Однако, поскольку они не отображаются в представлении, они никогда не обновляются. При выполнении команды Команда (Team) > Обновить (Update) в проекте все папки и файлы обновляются до единой версии. У меня есть пара блогов, которые объясняют это:

Это объясняет основную концепцию SVN смешанной рабочей копии редакции и имеет важное значение для понимания этого:

http://markphip.blogspot.com/2006/12/mixed-revision-working-copies.html

Второй показывает функцию в Subclipse для решения этой задачи:

http://markphip.blogspot.com/2006/12/subclipse-synchronize-feature-show-out.html

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

Главное - время от времени использовать Team > Update on your project, чтобы довести все до единой редакции.

Марк

-121--1621880-

Начните с учебного пособия по Java

http://java.sun.com/docs/books/tutorial/getStarted/index.html

Затем купите Head First Java

http://oreilly.com/catalog/9780596004651

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

-121--1119788-

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

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

16
ответ дан 24 November 2019 в 15:48
поделиться
ALTER TABLE foo AUTO_INCREMENT=1

Если вы удалили самые последние записи, это должно настроить его на использование следующей самой низкой доступной записи. Пока еще нет 19, удаление 16-18 приведет к сбросу автоинкремента на использование 16.


РЕДАКТИРОВАТЬ: Я пропустил бит о phpmyadmin. Вы также можете установить его там. Перейдите к экрану таблицы и щелкните вкладку операций. Там есть поле AUTOINCREMENT , в котором вы можете установить все, что вам нужно, вручную.

35
ответ дан 24 November 2019 в 15:48
поделиться

Проблема заключается в том, что это нестатический класс члена, поскольку он работает как при объявлении MyClass статическим, так и при создании класса верхнего уровня. Хотя не совсем уверен, почему.

-121--3690453-

Что делает ваш поток?

Если вы пытаетесь переместить материал во второй поток, чтобы избежать ограничений на то, что вы можете сделать внутри Dll Main, трудная удача. Они не являются ограничениями на то, что может сделать Dll Main, они являются ограничениями на то, что можно сделать во время работы Dll Main (и удерживают блокировку загрузчика). Если поток должен взять блокировку загрузчика, он будет ждать, пока первый поток не завершит его использование. Если ваша нить не нуждается в блокировке загрузчика, я не понимаю, почему она не может быть немедленно продолжена... но нет такой вещи, как нить, которая не нуждается в блокировке загрузчика. Перед запуском потока Windows должна отправить DLL_THREAD_ATTACH сообщения во все DLL-библиотеки, а это значит, что он также вызывает собственную Dll Main, и Windows защищает от повторного входа.

Это никак не обойдется. Поток не может быть запущен до тех пор, пока не DLL_THREAD_ATTACH обработка, и это не может произойти, пока первый поток находится в Dll Main. Единственный способ обойти это - начать новый процесс (который имеет независимую блокировку загрузчика и не будет блокировать ожидание вашего).

-121--3107803-

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

0
ответ дан 24 November 2019 в 15:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: