为什么有一个oracle 表主键自增长id自增长的表,id突然变得很大

160被浏览17,349分享邀请回答244 条评论分享收藏感谢收起hedengcheng.com/?p=52535添加评论分享收藏感谢收起在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
当单表的数据量过大时,会采用MySQL进行水平拆分,请问原先的自动增长的ID有什么好的解决办法?
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
水平拆分后,同一张表的数据放在不同的库上,无法再依赖数据库本身的auto_increment实现ID的唯一性,多个库之间产生的ID会造成冲突。因此ID不应该由数据库来分配,那么应该由什么来分配,我觉得要分两种情况:
如果应用是通过数据库中间件来访问后台的MySQL,那么ID应该由中间件来生成
如果没有中间件,ID由应用生成
但无论是应用还是中间件,应用肯定会是多个的(多个客户端),而中间件,中间件一般也不会部署一个单实例,这样会有单点问题(single point of failure), 中间件在生产环境下,是集群部署的。
那么问题就清晰明了得多了,无论是上面哪一种情况,实际上你需要的是一个全局的,global的ID生成器。
全局的global生成器有很多种方式可以实现
从公共数据库取ID
把ID生成策略放在zookeeper集群上,去zookeeper集群上取全局ID
基本的策略就是这样了。还有一点小细节。
全局ID最好以表来划分,一个表对应一个全局ID上下文,不同的表去不同的全局ID上下文取。
另外一个,无论是中间件也好,应用也好,取全局ID时不要每次只取一个,那样性能太低了,更好的方式是每次取一段ID,比如应用1取到了1-50这段ID,那么它就可以在这50个ID用完之前,不再需要去取ID;应用2也去取ID,那么它会取到51-100这段ID,这个思想有点像储存食物过冬一样。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
目前我这已知的方法:1.修改原有的自增列,变为不自增主键。自己维护主键
2.水平拆分为拆分已有数据,也就是说拆分出去的表的数据不会再做变化。新增的数据依然自增。(注意不能设置自增填充空白id)
3.做个统一算法。自增id需要计算后写入,而不是自动维护
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
我这边之前也有这样的需求。我是这么处理的:把主键列去掉自增长,通过redis的incr产生自增序列值,插入的时候指定id的值
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
1.把自增ID这个功能,用一张表与一个存储过程做成一个小模块。
2.被拆分的表,当有数据INSERT时,就调用这个存储过程来申请一个新ID。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
分表后主键要自己生成最好,很多开源的主键生成策略算法,比如说twitter的snowflake等如果不想改动程序的话,设置每个集群中自增 ID 起始点(auto_increment_offset)以及 ID 自增步长(auto_increment_increment),让目前每个集群的起始点错开,达到将 ID 相对分段的效果来满足全局唯一的效果。优点是实现简单,对应用透明,缺点就是,以后如果根据id做路由的话不好扩展
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。11:55 提问
数据表ID自增长另外定义了一个主键,向数据库插入一条数据报错,提示主键冲突
sql _:insert into POS_SaleMaster (companyID,billNo,shopID,billDate,billTime,vipID,cashierID,personnelID,payMethod,payAmount,cashAmount,bankCardAmount,changeAmount,vIPIntegral,billStatus,finished,checkDate,promotionID,printDegree,roundDigitNum,otherAmount,otherAmountPresend,dischargeIntegralAmount,dischargeIntegral) values ( 'UR','UR037','UR000057',' 19:05:56',' 19:05:56','8urP0282105','','','6','237','0','237','0','237','4','0',' 19:05:56','38','0','0','0','0','0','0' ) 19:05:55,786 ERROR
com.microsoft.sqlserver.jdbc.SQLServerException: 违反了 PRIMARY KEY 约束“PK_POS_SaleMaster”。不能在对象“dbo.POS_SaleMaster”中插入重复键。重复键值为 (UR024)。 19:05:55,786 ERROR
按赞数排序
自增长的不要设置,让它自己插入,主键要确保不能重复。
----------------------同志你好,我是CSDN问答机器人小N,奉组织之命为你提供参考答案,编程尚未成功,同志仍需努力!
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐当前位置: →
→ 为何有一个主键id自增长的表,id突然变得很大
为何有一个主键id自增长的表,id突然变得很大
& 作者:佚名 & 来源: 互联网 & 热度:
&收藏到→_→:
摘要: 为什么有一个主键id自增长的表,id突然变得很大id本来增加到了50000,这都正常的,然后我去数据库的实体模型里面把string&nbsp...
"为何有一个主键id自增长的表,id突然变得很大"::
为什么有一个主键id自增长的表,id突然变得很大id本来增加到了50000,这都正常的,然后我去的实体模型里面把string&id改为long&id(里面的id是number)。然后又加了一条数据,他的id为2826200.再添加记录的id为2826201,过了2天再加2826250,它这么跳着来不是办法啊,求高手指导------解决方案--------------------cache&请设置成&0!设置自动增长主键时,可以设置从小到大依次增长的。查一下命令就好了 此文来自: 马开东博客
转载请注明出处 网址:
搜索此文相关文章:此文来自: 马开东博客
网址: 站长QQ
上一篇:没有了
为何有一个主键id自增长的表,id突然变得很大_Oracle面试相关文章
Oracle面试_总排行榜
Oracle面试_最新
Oracle面试_月排行榜
Oracle面试_周排行榜
Oracle面试_日排行榜怎么设置主键ID为从0开始并且自动增长的_百度知道
怎么设置主键ID为从0开始并且自动增长的
我有更好的答案
通常表中会有一个自增的id字段,那如果想id是从0开始怎么办呢..? mysql默认自增ID是从1开始了,但当我们如果有插入表或使用delete删除id之后ID就会不会从1开始了. 使用mysql时,但当我有时候我们在测试网站的时候,删除测试数据导致id不是从0开始
采纳率:86%
来自团队:
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 oracle 表主键自增长 的文章

 

随机推荐