2013-04-06 71 views
0

我试图给用户提供一种独特的随机代码,但没有跳过范围内的任何数字。我的表是这样的具有最小值的Oracle更新行

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

所以下次randomcode使用应该是003,然后001的问题是用户可以返回的代码,我应该给这个数字将someonelse。在那种情况下,我将IsUsed设置为NULL。

我试过用IsUsed列选择最小Rnum为NULL。然后更新表格。但遇到的竞争条件和用户得到重复的RandomCode。

更新表 设置任何帮助IsUsed = N'Y” WHERE IsUsed = NULL和RNUM = MIN(RNUM) RETURNING

回答

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 2013-04-08 11:06:23

+0

为什么你不尝试自己并加载测试你的查询?这样,你的概念就会变得更加清晰,你将学到很多其他的东西。我评论这不会是对我来说正确的事情。 :) – Rachcha 2013-04-08 18:58:58

+0

感谢您的评论rachcha。但我认为这是造成种族问题的原因。 – n3xus 2013-04-09 01:17:43