数据库主键生成

来源:互联网 发布:企业数据管理制度 编辑:程序博客网 时间:2024/05/16 05:23

--创建  
  create   procedure   p_srl  
  as  
          select   (convert(char(6),getdate(),12)   +    
                        replace(convert(char(12),getdate(),14),':','')   +    
                        right(newid(),6))  
   
   
  --执行  
  exec   p_srl 

 

--主键用随机数难以保证唯一,在生成主键上要多做校验工作  
   
  --处理示例  
   
  --创建一个视图,生成编号  
  create   view   v_getNo  
  as  
  select   No=convert(char(6),getdate(),12)  
  +replace(convert(varchar(12),getdate(),14),':','')  
  +right(newid(),6)  
  go  
   
  --创建一个函数,目的是得到不重复的一个编号  
  create   function   f_No()   returns   char(21)  
  as  
  begin  
  declare   @re   char(21)  
  select   @re=No   from   v_getNo  
  while   exists(select   *   from   tb   where   bh=@re)  
  select   @re=No   from   v_getNo  
  return(@re)  
  end  
  go  
   
  --创建表,使用这具函数  
  create   table   tb(bh   char(21)   primary   key   default   dbo.f_no(),name   varchar(10))  
  insert   tb(name)   values('张三')  
  insert   tb(name)   values('李三')  
  select   *   from   tb  
  go  
   
  --删除测试  
  drop   table   tb  
  drop   view   v_getno  
  drop   function   f_no  
   
  /*--结果  
  bh                                         name                
  ---------------------   ----------    
  0504011356565904832EF   李三  
  050401135656590EF57B2   张三  
   
  (所影响的行数为   2   行)  
  --*/

 

 

--建立用流水号,这样不必为校验生成的编号是否重复而浪费时间  
   
  --处理示例  
   
  --创建一个视图,得到当前日期信息  
  create   view   v_getdate  
  as  
  select   dt=convert(char(6),getdate(),12)  
  +replace(convert(varchar(12),getdate(),14),':','')  
  go  
   
  --创建一个函数,取得新编号  
  create   function   f_No()   returns   char(21)  
  as  
  begin  
  declare   @re   char(15)  
  select   @re=dt   from   v_getdate  
  return(  
  select   @re+right(1000001+isnull(right(max(bh),6),0),6)  
  from   tb  
  where   bh   like   @re+'%')  
  end  
  go  
   
  --创建表,使用这具函数  
  create   table   tb(bh   char(21)   primary   key   default   dbo.f_no(),name   varchar(10))  
  insert   tb(name)   values('张三')  
  insert   tb(name)   values('李三')  
  select   *   from   tb  
  go  
   
  --删除测试  
  drop   table   tb  
  drop   view   v_getdate  
  drop   function   f_no  
   
  /*--结果  
   
  bh                                         name                
  ---------------------   ----------    
  050401140128590000001   张三  
  050401140128590000002   李三  
   
  (所影响的行数为   2   行)  
  --*/