登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> 程序员学前班[不再更新,只读] >> 主题: [mssql/sql server]SET IDENTITY_INSERT [table] ON 让自增[量]字段可编辑     [回主站]     [分站链接]
标题
[mssql/sql server]SET IDENTITY_INSERT [table] ON 让自增[量]字段可编辑
clq
浏览(0) + 2009-02-24 17:45:32 发表 编辑

关键字:

“自增字段”的恢复

from http://blog.donews.com/blogtiger/archive/2005/11/15/627182.aspx

昨天和Samuel.Lau讨论了一下有关SqlServer恢复时的问题, 提到了"自增字段"的使用.
下面是相关的几句对话:
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================
下载testIdentity.sql


Trackback: http://tb.donews.net/TrackBack.aspx?PostId=627182

clq
2009-2-24 17:45:55 发表 编辑

据说 sql server 2005 用不了,未证实.

总数:1 页次:1/1 首页 尾页  
总数:1 页次:1/1 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1