原文连接:http://blog.sina.com.cn/s/blog_533749e20100b8jq.html
自己总结了一下MS SQL SERVER中添加自增字段的一些东西:
最简单的一种,在“设计表”的模式下编辑要设为自增字段的列属性。自增列的类型值必须是decimal、int、numeric、smallint、bigint 或 tinyint中的一种。在“表示”下拉菜单中选“是”,“标识种子”中填入自增字段的初始值,在“标识地增量”中填入自增量。
用SQL命令在SQL查询分析器中执行自增列的插入。
ALTER TABLE table_name ADD column column_type IDENTITY(seed,increment)
table_name是要插入自增字段的表格名,column_type必须是decimal、int、numeric、smallint、bigint 或 tinyint中的一种,seed和increment分别是自增字段的初始值和自增量。这两个值要么都指定,要么都留空。如果留空则默认值都是1,即初始值为1,以后每次都增加1。
SQL查询分析器好像不支持修改已有字段为自增字段,所以如果要将已有字段改为自增字段,只有先
ALTER TABLE table_name DROP COLUMN column_name把列名为column_name的列先删除,然后再执行
ALTER TABLE table_name ADD column column_type IDENTITY(seed,increment)命令重新插入。当然,删除已有列的前提是该列上不能有关联其他表的约束,否则还要用drop constraint先去除约束。鉴于这么操作过于复杂,而且很容易造成混乱,建议还是建立新列作为自增列。
此外,MSSQL SERVER不会重复使用已删除的标识值,所以使用一段时间之后标识符列的值可能会变得较为混乱,可以通过执行以下命令来解决:
DBCC CHECKIDENT ('table_name')
此命令将按其原来的seed和increment值重新对table_name表中的标识列进行赋值
DBCC CHECKIDENT ('table_name', RESEED)
同上
DBCC CHECKIDENT ('table_name', RESEED, new_reseed_value)
此命令将从new_reseed_value开始重新对table_name表中的标识列进行赋值
关于MSSQL SERVER到底为什么不支持对已有列执行SQL语句来将其修改为自增列,看了看帮助文件中ALTER语句的语法:
ALTER TABLE table
{
[ ALTER COLUMN column_name
new_data_type [ ( precision [ , scale ] ) ]
[ COLLATE < collation_name > ]
[ NULL | NOT NULL ]
| {ADD | DROP } ROWGUIDCOL }
]
[ < column_definition > ]
[ ,...n ]
| [ WITH CHECK | WITH NOCHECK ] ADD
< table_constraint > } [ ,...n ]
| DROP
[ CONSTRAINT ] constraint_name
| COLUMN column
} [ ,...n ]
| { CHECK | NOCHECK } CONSTRAINT
ALL | constraint_name [ ,...n ] }
| { ENABLE | DISABLE } TRIGGER
ALL | trigger_name [ ,...n ] }
}
< column_definition > ::=
column_name data_type }
[ [ DEFAULT constant_expression ] [ WITH VALUES ]
]
[ COLLATE < collation_name > ]
[ < column_constraint > ] [ ...n ]
< column_constraint > ::=
[ CONSTRAINT constraint_name ]
[ NULL | NOT NULL ]
[ CLUSTERED | NONCLUSTERED ]
[ WITH FILLFACTOR = fillfactor ]
[ ON { filegroup | DEFAULT } ]
]
REFERENCES ref_table [ ( ref_column ) ]
[ ON DELETE { CASCADE | NO ACTION } ]
[ ON UPDATE { CASCADE | NO ACTION } ]
[ NOT FOR REPLICATION ]
]
( logical_expression )
< table_constraint > ::=
[ CONSTRAINT constraint_name ]
[ { PRIMARY KEY | UNIQUE }
( column [ ,...n ] )
}
[ WITH FILLFACTOR = fillfactor ]
[ ON { filegroup | DEFAULT } ]
]
[ ( column [ ,...n ] ) ]
REFERENCES ref_table [ ( ref_column [ ,...n ] ) ]
[ ON DELETE { CASCADE | NO ACTION } ]
[ ON UPDATE { CASCADE | NO ACTION } ]
[ NOT FOR REPLICATION ]
| DEFAULT constant_expression
[ FOR column ] [ WITH VALUES ]
( search_conditions )
如红色标记的两行所示,对于IDENTITY属性的修改仅有ADD COLUMN支持,而ALTER COLUMN不支持,因此不能通过SQL语句修改已有字段为自增字段。
但是,ALTER COLUMN中提供了{ADD | DROP } ROWGUIDCOL,所以似乎可以迂回地使用 ROWGUIDCOL 属性、uniqueidentifier 数据类型和 NEWID 函数来定义全局唯一标识符列