【分享个sql server取唯一值的方法】-在10位数以内
-------------------------------- \\ 问题
我最近遇到一个问题,就是我在表里设置了一个主键【Class_Id】,需要满足三个条件。
1、这个字段【可以修改】
2、不能有数据重复。
3、自动获取编号(当然不能重复)。
-------------------------------- \\ 解决
1、在程序添加记录中添加:先取出最大号max(class_id)+1,再insert (我不想这样,太麻烦)
2、在sql server 字段默认值中写入以下代码,注意没有“【】”,是先取到1990-8-1的小时数+分钟数+毫秒数,但是总长度超过了【10】位(int字段最大值10位),只能用bigint,但bigint在vfp中还得转换,很烦人。
【(CONVERT([bigint],(CONVERT([varchar](10),datediff(hour,'1990-8-1',getdate()),(0))+CONVERT([varchar](10),datepart(minute,getdate()),(0)))+CONVERT([varchar](10),datepart(millisecond,getdate()),(0)),(0)))】
*** 各位在sql server中试的话,需要在这段代码前面加上“select ”
3、谁有更好的取唯一值方法或者取的位数能长度小于10位数,能赋给int类型字段?
[解决办法]
1、其实主键字段尽量不要修改。
2、一般用个自动量,可以删除,不可以修改。
3、用 vfp 的SYS(2015) 唯一值,然后写到 SQL Server,不过这个是字符型。
SYS(2015) 返回的名称是以系统日期和系统时间来创建的。在同一毫秒间隔期间中不只一次地调用 SYS(2015) 返回一个唯一的字符串。(你的代码也存在这个问题)
SYS(3)返回唯一值全是数字,返回是字符型,将字符型转换为数值型即可使用。这个也存在同一毫秒间隔期间中不只一次地调用 SYS(3) 返回一个唯一的字符串(当在一台快速的计算机上连续发出 SYS(3) 时,它可能会返回一个不唯一的名称。)
4、SQL Server 可以用 NEWID()函数产生唯一值,不过位数和类型与你的要求不太符,不过这个是绝对的唯一。