Можете ли вы использовать автоинкремент в MySql без его первичного ключа - PullRequest
3 голосов
/ 11 марта 2009

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

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

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

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

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

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

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

Ответы [ 6 ]

9 голосов
/ 11 марта 2009

Значение GUID должно быть уникальным для таблиц и даже баз данных, поэтому сделайте первичный индекс столбца auto_increment и сделайте UNIQUE-индекс для GUID

5 голосов
/ 11 марта 2009

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

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

0 голосов
/ 13 августа 2010

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

0 голосов
/ 11 марта 2009

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

0 голосов
/ 11 марта 2009

Пара мыслей:

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

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

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

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

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

0 голосов
/ 11 марта 2009

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

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

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

...