位置: 编程技术 - 正文

sqlserver数据库主键的生成方式小结(sqlserver,mysql)(sqlserver的主数据库是什么)

编辑:rootadmin
主键的生成方式主要有三种: 一. 数据库自动生成 二. GUID 三. 开发创建 严格讲这三种产生方式有一定的交叉点,其定位方式将在下面进行讲解。 第一种方式,主要将其定位在自增长的标识种子:可以设置起始数值,及增长步长。其优点在于使用时完全将并发任务交于数据库引擎管理,你不用担心存在多用户使用的时候会产生两个相同的ID的情况。其缺点也在于此,多数的数据库不提供直接获取标识ID的方式,对于开发人员来说产生ID的方式是透明的,开发人员几乎无法干预此项。对于数据的迁移也不是很方便。 由于存在上面的利弊,这种自增长的ID一般多用于设计基础表(系统运行的基础信息,如员工表)主键,而极少(根本不)用于主从表主、外键,因为在产生主从表数据并关联时,必须确定主表的ID,然后才能定位从表的关联ID。 例(MsSQL): 结果: (1 行受影响) (1 行受影响) 消息 ,级别 ,状态 ,第 3 行 将截断字符串或二进制数据。 语句已终止。 (1 行受影响) (3 行受影响) Id Number Name Password Description 1 1st Id=1,因为起始值1 3 2nd Id=3,因为起始值1,步长2 7 4th Id=7 not 5,因为第三条记录插入失败 第二种方式,GUID即Globally Unique Identifier,也称为UUID(Universally Unique IDentifier),全球唯一标识符,GUID一般由位十六进制的数值组成,其中包含网卡地址、时间及其他信息。任何两台电脑都不会产生相同的GUID,他的优点在唯一性,当需要数据库整合时,能节约不少劳动力。比如总公司和分公司各自系统独立运行,所有分公司数据定期需要提交到总部,可以避免合并数据时主键冲突问题,同时GUID还兼具自增长标识种子特点,无需开发人员太多的关注。但是GUID信息量大,占用空间也大,关联检索时,估计效率上也不是很高,对于位的十六进制其可读性也差,虽然主键有对用户的无意义性,但是在设计或者调试交流时很不方便。 从长远考虑,为了保证数据的可移植性,一般还是会选择使用GUID来作为主键。 例(MsSQL): 结果: Id Number Name Password 8EF-B4D3-4C--BC6CDBBC 1st F-7D0E---EC9FC6F6 2nd E0EA0---AF-5D0BD 3rd 第三种方式开发创建,其便捷性在于可控制性,此可控制性是指其组成形式,可以是整形、也可以是字符型,你可以根据实际情况给予多样的组成及产生形式,说到这里可能有的朋友就想起来自动产生单号,如:或者PI--等等,没错,自我创建同样适用于这些类似的应用。 说到自我创建,多数首先想到的是取Max(Id)+1,这种方式虽然省事,但是实际上对于定制(在生产单号之类的有一定意义的信息时可能会有这样的需求,主键没必要)及并发的处理并不是很好。如,当前表中最大编号为,当C1和C2用户同时取这个Id处理时,得到的都是,导致保存失败。常规的做法是在取值时候加锁,但是当多用户频繁操作时,性能是个很大的问题,其中主要的原因之一是直接操作的业务数据表。 针对此种情况,解决方案是使用键值表来保存表名、当前或者下一个Id及其他信息,如果系统中多个表Id都使用这种方式,那么键值表中就会有多条相应的规则记录;当然也可以让整个数据库所有表的Id从都按相同的规则从一个源产生,那么键值表中只需要一条规则记录即可。 下面来看看这样一个使用键值表例子的演变(MsSQL): 执行存储过程UP_NewTableID: 运行的时会发现很正常,获取的结果也很正确。但是如果在高并发的情况,多个用户可能就会获取相同的ID,如果获取的ID后是用于保存对应表中的记录,那么最多只有一个用户能保存成功。 下面模拟一下并发情形,将上面的存储过程UP_NewTableID中语句WAITFOR DELAY '::'的注释去掉,打开3个查询分析器的窗体,依次执行上面语句。 预期是想分别获得1,2,3,但是也许会发现多个窗体的运行结果都是:1。这就是说在更新语句执行之前,大家都获取的ID是0,所以下一个数值都是为1。(实际的数值,根据DELAY的参数大小及运行时间按间隔有关) 从这方面来分析的话有的朋友可能就会想到,是否可以在更新语句执行时判断ID是不是原始ID了?修改过程: 如果打开个3个执行过程来模拟并发,那么会有2个窗体出现: 消息 ,级别 ,状态 1,过程 UP_NewTableID,第 行 Warning: No such row is updated 由此会看到还是会由于并发导致有用户操作失败,但是较上一个至少将错误出现的时间点提前了。 那么有没有更好的方法,从查询到更新结束整个事务过程中,不会有任何其他事务插入其中来搅局的办法呢,答案很明确,有,使用锁!需要选择适当的锁,否则效果将和上面的一样。 可以打开N(N>=2)个窗体来进行测试,将会看到所有操作都被串行化,结果就是我们想要的那样。如此注释或者去掉模仿并发的语句WAITFOR DELAY '::'即可。 如前面所说,这同样适应于单据编号类似编码的产生形式,只要对前面的代码及键值表稍作修改即可,有兴趣的朋友可以一试。如果是从前端取得这个编号,并应用于各个记录,那么可能存在跳号的可能。如果为了保证不存在跳号,一种解决方案就是使用跳号表,将跳号记录定期扫描并应用于其他记录。另一种解决方案是将记录的保存操作放置到编号产生的过程中,形成一个串行化的事务。 俗话说萝卜白菜各有所爱,您用哪一种自有你的道理。

推荐整理分享sqlserver数据库主键的生成方式小结(sqlserver,mysql)(sqlserver的主数据库是什么),希望有所帮助,仅作参考,欢迎阅读内容。

sqlserver数据库主键的生成方式小结(sqlserver,mysql)(sqlserver的主数据库是什么)

文章相关热门搜索词:SQLserver数据库主外键关系图,sqlserver数据库名称是哪个,SQLserver数据库主外键关系图,sql数据库主键是什么,sql-server数据库,sqlserver的主数据库是什么,sql server 数据库介绍,sqlserver的主数据库是什么,内容如对您有帮助,希望把文章链接给更多的朋友!

sqlserver主键设计的注意点 在设计主键的时候往往需要考虑以下几点:1.无意义性:此处无意义是从用户的角度来定义的。这种无意义在一定程度上也会减少数据库的信息冗余。常

SQL Server字符串切割函数 CREATEFUNCTIONfGetStrBySplit(@SourceVARCHAR(max),@IndexINT,@SplitCharVARCHAR(1))RETURNSvarchar(MAX)ASBEGINDECLARE@LenINTDECLARE@nINT=0DECLARE@ChIndexINTDECLARE@ResultVARCHAR(MAX)--获取总长度SET@L

CREATE FUNCTION sqlserver用户定义函数 创建用户定义函数,它是返回值的已保存的Transact-SQL例程。用户定义函数不能用于执行一组修改全局数据库状态的操作。与系统函数一样,用户定义函

标签: sqlserver的主数据库是什么

本文链接地址:https://www.jiuchutong.com/biancheng/348154.html 转载请保留说明!

上一篇:索引的原理及索引建立的注意事项(索引的基本原则)

下一篇:sqlserver主键设计的注意点(sqlserver如何设置主键)

  • 增值税普通发票税率
  • 电子税务局能不能抄税
  • 0税率开票如何做账
  • 多少金额以下可以一次性费用
  • 免税苗木普通发票
  • 2019年地方各项基金费申报表填写错误要交滞纳金吗
  • 发票查询校验码看不清怎么办
  • 季节性停用的设备应计提折旧吗
  • 年折旧额怎么计算公式直线法
  • 财务报表有哪些局限性
  • 实际利率法的计算过程
  • 支付税收罚款怎么算企业所得税
  • 银行询证函费用计入财务费用还是管理费用
  • 营业外支出罚款要交税吗
  • 预付账款发票到货未到怎么做账
  • 购车税务发票
  • 2020年购进农产品的扣除率
  • 托儿所幼儿园卫生保健工作规范2022
  • 政府会计制度事业单位会计制度
  • 建筑业工人工资保障
  • win7 右键 没反应怎么办
  • 溢价购入债权投资是为啥
  • win10电源模式最佳性能多耗好多电
  • 32位升级64位系统教程
  • php数组根据值排序
  • PHP:Memcached::isPristine()的用法_Memcached类
  • PHP:curl_getinfo()的用法_cURL函数
  • php教程全集
  • 仓储服务和不动产租赁
  • yii2框架从入门到精通
  • 资产提前报废需要什么资料
  • 计提资产减值准备是利好还是利空
  • 暂估纳税调增了账务怎么处理
  • tensorflow2安装
  • session跨域导致失效
  • 前端向后端传递对象数组
  • 桥闸通行费发票上注明的金额含税吗
  • 代扣代缴的企业所得税计入成本吗
  • 残保金工资标准
  • 电信收款收据可以入账吗
  • 厂区道路不应该使用哪种材料
  • 增值税进项税加计抵扣
  • 工会经费和残保金不交有什么影响
  • wordpress文章发布不显示作者
  • 如何解决面颊毛孔粗大
  • java基础介绍
  • 不是公司员工差旅费可以入差旅费吗
  • 进项税额在贷方怎么办
  • mysql数据数据库
  • 有限公司能变更成个体工商户吗
  • 车间设备折旧费计入产品成本吗
  • 个体工商户还没开业也要报税吗
  • 制造费用的结转正确的是( )
  • 固定资产工作汇报
  • 利润分配科目是所有者权益科目吗
  • 红冲以前年度费用
  • 在建工程里面的费用最后怎样结转
  • 医疗保险个人缴纳比例
  • 申报高新技术企业专利有什么要求
  • 固定资产原值的构成内容是
  • 私人银行卡给公司走账有影响吗
  • windows下怎么安装mac
  • mmc无法创建管理单元怎么办win11
  • linux进程详解
  • jetcar.exe - jetcar是什么进程 有什么作用
  • win7筛选键
  • node.js的express
  • Android通过HttpURLConnection获取JSON并进行UI更新
  • react父组件触发子组件方法
  • bootstrap页面代码
  • unity3d插件手机版
  • windowsxp命令行窗口怎么打开
  • Python 正则表达式的高级用法
  • 基于JAVASCRIPT实现的可视化工具是
  • javascript创建对象的三种方法
  • Android开发使用的官方IDE是
  • 年收入12w
  • 房子没有使用权
  • 辽宁事业单位职测考试时间多长
  • 中国浙江到英国伦敦多少公里
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设