数据库“自定义存储过程”超级难题,编写复杂计算

hproof 2003-05-15 03:07:44
有一个表 table, 它只有一个字段,也是主键:

uid bigint

uid是一特殊类型的数据,它的取值只能为1,2,4,6,8……且不可重复(因此最多只能有64条记录)。

对该表进行 INSERT 时,由于uid是不可重复,又不能自动增长,我们必须指定它的值。但问题是如何确定uid值?

如果表中已经有(1,2,4),则uid可取8;
如果表中已经有(1,4),则uid可取2; // 为了利用有限的储存空间

方法1:在程序中实现的,检索所有的uid,并确定可用的数值。但是,由于它是主键,必须保证插入时没有重复!锁定表?还是利用编程同步?由于实际的运行中是分布式的计算,编程同步无效,只能是锁定表。(可惜我不知道怎么做)

方法2:编写储存过程,,但我不知道具体的算法。。

=================================================
高分征求解决方案!


...全文
41 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
hproof 2003-06-13
  • 打赏
  • 举报
回复
ALTER PROCEDURE dbo.GetUid
AS
begin
/*
[uid]表中记录了所有已经使用的值,通过检查每一个值是否已经在[uid]中出现,得到新的值
*/
/* @uid 从1,2,4,8,16……增加,检查[uid]表中是否已经有该值 */
/* @ret 为找到的新的未被使用的合法值,0则失败 */
declare @uid bigint, @ret int;
set @uid=1;
set @ret=0;

/*
create table [uid](uid int primary key);
*/

while(@uid < 0x7fffffff)
begin
/* 查找该 @uid 值是否已经出现*/
select @ret=uid from [uid] where uid=cast(@uid as int);

/* 如果该值未被使用,则找到了 */
if(@ret is null or @ret=0)
begin
set @ret=cast(@uid as int);
insert into [uid] values(@ret);
break;
end

/* 继续查找 */
set @uid=@uid*2;
set @ret=0;
end

RETURN @ret;
end
hproof 2003-05-15
  • 打赏
  • 举报
回复
搞定了,利用储存过程加上编码。
nik_Amis 2003-05-15
  • 打赏
  • 举报
回复
up
hproof 2003-05-15
  • 打赏
  • 举报
回复
to tj_dns(愉快的登山者) :

好象可以。也可以事先在回收表中保存所有的键值,插入时直接查找就行了。等我试成功后就给你加分~
愉快的登山者 2003-05-15
  • 打赏
  • 举报
回复
建议在建立一个表,做为主键回收表。
当删除一条记录时,将其主键值插入回收表;
当插入一条记录时,若回收表有记录,取最小的主键值,插入,并将此值从回收表中删除;若回收表中没有记录,取先表中最大主键值的2倍做为新主键值插入。

22,300

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧