Можете ли вы использовать автоматическое увеличение в MySQL, не используя его в качестве первичного ключа
-
10-07-2019 - |
Вопрос
Я использую 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 без повторного выбора таблицы.