我以前用的是access数据库,里面有个字段id,为自动编号,现在导入到mssql中了,当添加记录的时候那个id字段怎么办啊,也就是怎么能让mssql中出现自动编号这种字段?谢了!
常见问题
*******************************************************************
*******************************************************************
*******************************************************************
*******************************************************************
最近忙于将ACCESS的数据库转化为SQL SERVER的数据库的学习,从中摸索出几条经验,与大家分享.
2.转化时,跟日期有关的字段,SQL
SERVER默认为smalldatetime型,我们最好将它变为datetime型,因为datetime型的范围比smalldatetime型大。我遇见这种情况,用smalldatetime型时,转化失败,而用datetime型时,转化成功。
3.对此两种数据库进行操作的sql语句不全相同,例如:在对ACCESS数据库进行删除纪录时用:"delete * from user
where id=10",而对SQL SERVER数据库进行删除是用:"delete user where id=10".
4.日期函数不相同,在对ACCESS数据库处理中,可用date()、time()等函数,但对
SQL SERVER数据库处理中,只能用datediff,dateadd等函数,而不能用date()、time()等函数。
5.在对ACCESS数据库处理中,sql语句中直接可以用一些VB的函数,像cstr()函数,而对SQL
SERVER数据库处理中,却不能用
*******************************************************************
SQLServer数据库自增长标识列的更新修改操作
一、修改标识列字段的值:(在执行insert时,将ID手动的设置成想要的值)
SET IDENTITY_INSERT [TABLE][ON|OFF]
使用上述语句,可以方便的控制某个表的某个自增长标识列是否自动增长,也就是说是否允许你在inert一条记录时手动指定主键标识列字段的值。
set identity_insert
insert into question_title (f_id,f_valid,f_questionTitle)
values(6,5,'hello');
二、重置标识列字段值:
DBCC CHECKIDENT(TABLE,[RESEED|NORESEED],[1])
DBCC checkident(question_title,reseed,1)
insert into question_title (f_valid,f_questionTitle) values(5,'hello');
执行成功后提示如下:
--检查标识信息: 当前标识值 '9',当前列值 '1'。
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
说明:以上显示数据库某表中当前ID最大值为9,当前设置的ID值为1。
*******************************************************************
发现MSSQL导入数据时标识列存在的问题,已解决!
(2008/1/11已更新,附上解决方案,可以自动修复标识列的编码规则)
最近在合并异地SQL数据的时候,发现MSSQL的标识列在合并数据时,可以启用标识插入也可以不启用标识插入,两种方法都可能存在一些潜在的问题,最严重的是导入操作改变了目的表的标识列编号规则。
场景:A地的A表,B地有B表,数据结构除了标误列的种子不一样外其它完全一样:
A(ID IDENTITY (1, 2), Content varchar(50)) 生成奇数主键ID
B(ID IDENTITY (2, 2), Content varchar(50)) 生成偶数主键ID
--A地的A表
CREATE TABLE dbo.A
GO
ALTER TABLE dbo.A ADD CONSTRAINT
--在A表中插入两条数据:预先插入A表两条数据
INSERT INTO [dbo].[A] ([Content]) VALUES ('A1') --生成1, 'A1'
INSERT INTO [dbo].[A] ([Content]) VALUES ('A3') --生成3, 'A3'
--B地的B表
CREATE TABLE dbo.B
GO
ALTER TABLE dbo.B ADD CONSTRAINT
--在B表中插入1条数据:预先插入B表1表数据
INSERT INTO [dbo].[B] ([Content]) VALUES ('B2') --生成2, 'B2'
现在要将A表数据导入到B表,问题出现了:
1. 不启用标识插入的问题:
2. 启用标识插入的问题:
2008-1-11,今天终于搞定了,一个存储过程完成解决,自动修复标识列的编码规则。
上例中,调用dbo.sp_RepairIDENTITY 'B', 'ID' 即可,执行结果如下:
当前最大值:3
标识种子:2
标识增量:2
当前标识值:3
需设新标识值:4
检查标识信息: 当前标识值 '3',当前列值 '4'。
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
结果:已修复标识,当前标识值重设为4
代码如下:
CREATE PROCEDURE dbo.sp_RepairIDENTITY
(
@Tablename nvarchar(255), --表名
@RowID_Name nvarchar(20) --标识列名
)
as
SET NOCOUNT ON
--Select @TableName=N'B',@RowID_Name=N'ID'
--获取最大标识值MaxID
Declare @sql nvarchar(4000), @MaxID bigint
Set @sql = N'Select @MaxID =Max(' + @RowID_Name + N') from ' +
@TableName
Exec sp_Executesql @sql, N'@MaxID
bigint output',@MaxID output
--print @MaxID
Declare @IDENT_CURRENT bigint, @NewIDentity bigint, @IDENT_SEED
int, @IDENT_INCR int
Select @IDENT_SEED = IDENT_SEED(@TableName), --标识种子
@IDENT_INCR = IDENT_INCR(@TableName), --标识增量
@IDENT_CURRENT = IDENT_CURRENT(@TableName), --当前标识值
@NewIDentity = @MaxID - @MaxID % cast(IDENT_SEED(@TableName) as
int) + IDENT_INCR(@TableName) --需要设置的新标识值
Print '当前最大值:' + Cast(@MaxID as nvarchar(20))
Print '标识种子:' + Cast(@IDENT_SEED as nvarchar(20))
Print '标识增量:' + Cast(@IDENT_INCR as nvarchar(20))
Print '当前标识值:' + Cast(@IDENT_CURRENT as nvarchar(20))
Print '需设新标识值:' + Cast(@NewIDentity as nvarchar(20))
------关键代码:启用标识导入数据或手工执行过DBCC CHECKIDENT('table_name',RESEED
new_reseed_value)就会造成编码规则改变,所以要修复编码规则
if(@IDENT_CURRENT < @MaxID or @IDENT_CURRENT % @IDENT_SEED
>0)
begin
end
else
begin
end
SET NOCOUNT OFF
*******************************************************************
mssql 如何更新标识列
其实bookid为自增长列,执行报如下错误”无法更新标识列 'bookid'。“
通过设置identity_insert为on依然不行。
set identity_insert booklistinfo ON;
关闭原因:
----允许对系统表进行更新
exec sp_configure 'allow updates',1
reconfigure with override
GO
----取消标识列标记
update syscolumns set colstat = 0 where id = object_id('tablename')
and colstat = 1
GO
--插入id=8001-8003的行
...
----恢复标识列标记
update syscolumns set colstat = 1 where id = object_id('tablename')
and name = '标识列名称'
----重新设置标识的起始值
DBCC CHECKIDENT (表名称, RESEED, 10003)
----禁止对系统表进行更新
exec sp_configure 'allow updates',0
reconfigure with override
GO
这种方法蛮繁锁的。
*******************************************************************
MSSQL ALTER TABLE 用语句修改Primary key 的ID
alter
==================================================
不能直接修改为标识列:
==================================================
alter
==================================================
ALTER