在SQL SERVER 中的主关键字的设计方法(100分)

  • 主题发起人 主题发起人 kaimi
  • 开始时间 开始时间
K

kaimi

Unregistered / Unconfirmed
GUEST, unregistred user!
我以前用产生GUID的方法作为各个表的主关键字,因为是字符串型,并且长度到42,
如果数据量大了,可能会影响查询效率,能否用一种比较好的算法形成整数型数值?
希望推荐一种比较好的方法。谢谢!
 
用自增整数,将字段设为IDENTITY
 
在表中用clustered index
 
最好用一个没有逻辑意义的数字来表示。并用程序控制其增加。
 
我们的数据库在不同地点录入后再汇总到总部,当然主关键字不变,用自增整数显然不行,
还有什么好方法吗?
 
附加功能 将问题提前
 
To Kaimi :
如果你的主关键字除了保持记录的唯一性之外没有别的意义,那么定义成 Identity 类型
就足够了,汇总数据的时候不必把这个字段带过来,系统会自动生成唯一的值。
如果你的主关键字还有别的具体意义,比如单据编号,那么显然必须人工介入,规定关键
字取值范围,例如:A 部门的单据编号以“A”开头,就不会重复了。
就是这样的,看你采用什么方案了。
 
可以用一个附加表专门产生关键字
 
各个分部的数据库中用自增字段,汇总时用:部门编号-自增字段(转成字符型)获取字符型
的统一编号行吗?
 
agree BaKuBaKu
另外你可以在表中设置一个int类型字段作为你的不重复主键,每次insert操作时
insert your_table (your_index,.....)
values (now_index=select max(your_index)+1 from your_bable,.......)
 
当然不要误解我意思,自然SQL语句直接那么写会错的。
我意思是程序每次得到插入前的最大值,然后加1作为这次插入的值。
//这个工作最好防在一个存储过程里,自动在里面先取到上次最值,然后加1后插入!
这样也保证并发控制不会出现冲突!!!
eg:
CREATE PROCEDURE my_insert
@my_one int,
@my_two char(9),......//你的插入变量
declear @old_index
as
select @old_index=max(your_index) from your_table
if isnull(@old_index) then
@old_index=0
insert your_table (your_index,.......)
values (@old_index+1,@my_one,@my_two,...)
 
多人接受答案了。
 
后退
顶部