Samuel.Lau | : |
Samuel.Lau | : |
BlogTiger | : |
Samuel.Lau | : |
Samuel.Lau | : |
Samuel.Lau | : |
BlogTiger | : |
Samuel.Lau | : |
BlogTiger | : |
Samuel.Lau | : |
BlogTiger | : |
Samuel.Lau | : |
其实我平时的习惯和Samuel.Lau差不多, 也是不喜欢用"自增字段", 因为在数据库设计的时, 即便是想添加些临时的测试数据也会变得麻烦(比如, 如果我想加一列id=2的数据, 使用这个语句insert table1 (id, title) values (2, 'title name') 但"自增字段"是不允许指定值的, 所以会报错).
但是如果是团队协作情况可能会不一样, 所以最终我还是觉得使用"自增字段"还是有必要的:
1. 方便, 在数据库一次设定, 以后在程序中不需要再考虑编号的问题
2. 减少错误及程序设计的难度, 如果是程序中设计编号可能会导致一些比较难以查出的错误(如果多个会话同时去取编号, 可能会导致脏读, 尽管可以通过在Select的时候使用排他锁来解决, 但强制加锁的方式会给调试带来不便, 而且在程序设计也会相对复杂, 出错的机率也就大了)
3.如Samuel.Lau所说, 数据在恢复的时候可能会变得麻烦, 因为需要使用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================