Можете ли вы использовать автоматическое увеличение в MySQL, не используя его в качестве первичного ключа

StackOverflow https://stackoverflow.com/questions/634231

Вопрос

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

Мое приложение использует MySQL 5, nhibernate в качестве ORM.

Возможные решения, о которых я подумал, следующие:

  • измените первичный ключ на поле автоматического увеличения, но по-прежнему используйте идентификатор в качестве GUID, чтобы остальная часть моего приложения была согласованной.

  • создайте составной ключ, содержащий как GUID, так и поле автоматического увеличения.

Мои мысли в данный момент склоняются к ключевой идее composite.

Редактировать:Идентификатор строки (первичный ключ) в данный момент является идентификатором GUID.Я хотел бы добавить поле INT, которое автоматически увеличивается, чтобы оно было доступно для чтения человеком.Я просто не хотел отходить от текущего стандарта использования GUID в приложении в качестве первичных ключей.

Это было полезно?

Решение

Значение GUID должно быть уникальным для таблиц и даже баз данных, поэтому сделайте столбец auto_increment основным индексом и создайте УНИКАЛЬНЫЙ индекс для GUID

Другие советы

Я бы наклонился в другую сторону.

Почему?Потому что создание составного ключа создает у следующего встречного парня впечатление, что это нормально - дважды использовать один и тот же GUID в таблице, но с разными порядковыми номерами.

Пара мыслей:

  • Если ваш GUID является auntoincremental и уникальным, почему бы не позволить ему быть фактическим Первичным ключом?

  • С другой стороны, вы никогда не должны принимать семантические решения, основанные на программных проблемах:у вас проблема с MySQL, а не с дизайном вашей базы данных.

Итак, пара обходных путей здесь:

  • Создание триггера, который установит GUID в правильное значение после его вставки.Это MySQL-решение проблемы MySQL, без изменения семантики вашей схемы.

  • Перед вставкой запустите транзакцию (убедитесь, что для автоматической фиксации установлено значение false), узнайте последний идентификатор GUID, увеличьте и вставьте с новым значением.Другими словами, автоматическое увеличение не происходит автоматически :P

GUIDони не предназначены для заказа, вот почему AUTO_INCREMENT для них это не имеет смысла.

Однако вы можете использовать AUTO_INCREMENT для второго столбца составного первичного ключа в MyISAM таблицы.Вы можете создать составной ключ поверх (GUID, INT) столбец и сделайте так, чтобы второй столбец был AUTO_INCREMENT.

Чтобы сгенерировать новый GUID, просто позвони UUID() в INSERT оператор или в триггере.

Нет, только первичный ключ может иметь значение auto_increment в качестве своего значения.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top