“自增字段”的恢复

Samuel.Lau: 一般我不用数据库的"自动编号"
Samuel.Lau: 一般关系型数据库常规都是通过自动编号来定义关系。
BlogTiger:
Samuel.Lau: 但自动编号在数据库里是不能复制和创建的。
Samuel.Lau: 那么在复原数据和换表的情况下,将破坏这个关系表。
Samuel.Lau: 不知道你们有没有遇到这样的一个情况,就是,SQL库文件损坏,其中某个表无法读出
BlogTiger:
Samuel.Lau: 这样只能通过复原某个表,但在还原的过程中"自动编号字段"无法复制,所以,我作的数据库在ID字段都是自己编制编号
BlogTiger: SET IDENTITY_INSERT 可以做到自动编号字段的手动设置
Samuel.Lau: 现在网上流行的dvbbs就有这样的问题,数据库损坏后无法还原,
BlogTiger: SET IDENTITY_INSERT table ON后就可以手工插入任意值了呀
Samuel.Lau: 我印象里,SET IDENTITY_INSERT应该只能同时处理1个表,大于1个表就不能处理。

其实我平时的习惯和Samuel.Lau差不多, 也是不喜欢用"自增字段", 因为在数据库设计的时, 即便是想添加些临时的测试数据也会变得麻烦(比如, 如果我想加一列id=2的数据, 使用这个语句insert table1 (id, title) values (2, 'title name') 但"自增字段"是不允许指定值的, 所以会报错).

但是如果是团队协作情况可能会不一样, 所以最终我还是觉得使用"自增字段"还是有必要的:
1. 方便, 在数据库一次设定, 以后在程序中不需要再考虑编号的问题
2. 减少错误及程序设计的难度, 如果是程序中设计编号可能会导致一些比较难以查出的错误(如果多个会话同时去取编号, 可能会导致脏读, 尽管可以通过在Select的时候使用排他锁来解决, 但强制加锁的方式会给调试带来不便, 而且在程序设计也会相对复杂, 出错的机率也就大了)
3.如Samuel.Lau所说, 数据在恢复的时候可能会变得麻烦, 因为需要使用SET IDENTITY_INSERT这个开关

如果"自增字段"与SET IDENTITY_INSERT不是很了解, 可以看一下这个对于"自增字段"修改的例子:
下载testIdentity.sql

--=InsertData IDENTITY_INSERT off================

--正确的语法
INSERT INTO testIdentity (title)VALUES('testIdentity1')
INSERT INTO testIdentity (title)VALUES('testIdentity2')
INSERT INTO testIdentity (title)VALUES('testIdentity3')
--错误的用法, 语法虽然没有问题, 但因为"自增字段"是不允许在Insert语句中手工指定编号, 解决办法是将IDENTITY_INSERT在这个表打开
INSERT INTO testIdentity (id, title) VALUES(4,'testIdentity4')

--=InsertData IDENTITY_INSERT off================

--=InsertData IDENTITY_INSERT on================

--打开IDENTITY_INSERT
SET IDENTITY_INSERT testIdentity ON

--"自增字段"已经可以插入自定义的编号了
INSERT INTO testIdentity(id, title) VALUES(4,'testIdentity4')

--记得改过要关上,不然程序里面的正确语句反而不能执行了
--INSERT INTO testIdentity (title) VALUES('testIdentity5')

--关闭IDENTITY_INSERT
SET IDENTITY_INSERT testIdentity OFF

--关闭前下面语句反而会出错
INSERT INTO testIdentity (title) VALUES ('testIdentity5')

--=InsertData IDENTITY_INSERT on================

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值