2013-04-06 5 views
0

Я пытаюсь предоставить пользователям уникальный случайный код, но без пропуска любого числа в диапазоне. Мой стол, как этоСтрока Oracle Update с минимальным значением

RandomCode | IsUsed | RNum 
-------------------------- 
002  | Y  | 1 
004  | Y  | 2 
003  | NULL | 3 
005  | Y  | 4 
001  | NULL | 5 

Так что в следующий randomcode использовать должно быть 003, а затем 001. Проблема в том, пользователь может вернуть код и я должен дать это число до someonelse. В этом случае я устанавливаю значение IsUsed равным NULL.

Я попытался выбрать минимальное значение Rnum с столбцом IsUsed равным NULL. и затем обновлять таблицу. Но столкнувшись с состоянием гонки, и пользователи получили дубликат RandomCode.

Любая помощь

UPDATE TABLE SET IsUsed = n'y» WHERE IsUsed = NULL и RNum = MIN (RNUM) ВОЗВРАЩЕНИЕ

ответ

2

Вы сделали две маленькие ошибки в коде:

  1. Вы сделали IsUsed = NULL.

    Это условие всегда возвращает false. Ничто не соответствует NULL. Вместо этого используйте IsUsed IS NULL.

  2. Вы использовали RNum = MIN(RNum). Вместо этого используйте подзапрос.

Вот ваш вопрос с помощью этих простых модификаций.

UPDATE TABLE 
SET IsUsed = N'Y' 
WHERE IsUsed IS NULL 
and RNum = (SELECT MIN(RNum) FROM table WHERE IsUsed IS NULL) 
+0

Вызывает ли база данных БЛОКИРОВКА? – n3xus

+0

Почему бы вам не попробовать и загрузить тестовый запрос? Таким образом, ваши концепции станут понятнее, и вы узнаете много чего другого. Я комментирую это, это было бы неправильно для меня. :) – Rachcha

+0

Спасибо за ваш комментарий rachcha. Но я думаю, что это вызывает проблему гонки. – n3xus

Смежные вопросы