Предположим, у вас есть таблица, в которой хранятся музыкальные предпочтения людей, и вы хотите дать пользователям возможность оценивать их предпочтения. Во время вставки поле ранга должно рассчитываться автоматически. Позже, однако, пользователь должен иметь возможность редактировать свои рейтинги.
id, memberid, trackid, rank
EDIT: Кажется, лучший способ сделать это - найти max для члена существующих рангов и добавить один...
Похоже, вы хотите ранжировать вновь вставленный элемент автоматически внизу.
INSERT INTO Prefs (MemberId, TrackId, Rank)
SELECT @MemberID, @TrackID,
MAX(ISNULL(Rank,0))+1
FROM Prefs
WHERE MemberId = @MemberID
Кроме:
Почему бы не сохранить rank
null до тех пор, пока пользователь фактически не даст каждому элементу значение ранга? Представьте пользователю все элементы и заполнив (или нет!) Ранг, а затем запустите оператор UPDATE
для каждого элемента.
Как ваши пользователи будут оценивать треки? Будут ли они заказывать их один за другим в каком-то пользовательском интерфейсе?
Если это так, я предлагаю делегировать нумерацию рангов на клиентскую сторону (интерфейс). Поэтому, если у вас будет интерфейс, который позволяет пользователям перетаскивать и перемещать дорожки вокруг, чтобы ранжировать их по порядку, просто назначьте им порядковый номер ранга, а когда они нажмут "Сохранить", отправьте эту информацию в базу данных.
ОБНОВЛЕНИЕ:
Если вы хотите, чтобы новая запись всегда занимала последнее место, вы могли просто получить MAX(rank) WHERE memberid = ?
, а затем INSERT
новую строку с rank + 1
, как вы предложили в вопросе. Обертка всего в транзакции гарантирует atomicity.
MAX(rank) WHERE memberid = ?
и вставьте с рангом + 1, как вы предложили в вопросе. Завершение всего в транзакции гарантирует атомарность ... (Обновленный ответ с информацией в этом комментарии)
Сделать ранг автоматическое увеличение? Он будет просто увеличивать это поле каждый раз, когда вы вставляете. Как id.
Перечитывая свой вопрос, я думаю, что не понимаю его. Вы хотите, чтобы рейтинг был автоматическим или это поле, которое пользователи задают в зависимости от предмета? если его первое я не понимаю, что не так.
Я думаю, что вопрос, который вы задаете, "как я узнаю, что следующий ранг должен быть для каждого пользователя?"... но я не уверен.
Если это так, вы можете просто обмануть и сохранить поле "max rank" в таблице users для каждого идентификатора пользователя. Вы должны запросить это значение, прежде чем вставлять новое ранжирование и увеличивать его как для таблицы пользователей, так и для таблицы ранжирования.
В качестве альтернативы вы можете использовать "select max (rank) из ранжирования, где memberid =?" введите запрос, чтобы база данных вычислила его для вас. Не самый эффективный, но для ITunes-подобной базы данных он, вероятно, будет управляемым (то есть, если количество песен * не слишком велико ".