2015-08-20 99 views
1

下面的脚本创建一个表,暂时关闭自动标识,在指定PK值时插入记录,然后重新启用自动标识。IDENTITY_INSERT和SQL Server Compact

DROP TABLE Foo; 
GO 

CREATE TABLE Foo (Id int IDENTITY (1,1) NOT NULL, 
        Bar nvarchar(100) NOT NULL); 
GO 

ALTER TABLE Foo ADD CONSTRAINT FooConstraint PRIMARY KEY (Id); 
GO 

SET IDENTITY_INSERT Foo ON; 
GO 

INSERT INTO Foo(Id, Bar) VALUES (1, 'a'); 
GO 
INSERT INTO Foo(Id, Bar) VALUES (2, 'b'); 
GO 
INSERT INTO Foo(Id, Bar) VALUES (3, 'c'); 
GO 

SET IDENTITY_INSERT Foo OFF; 
GO 

INSERT INTO Foo(Bar) VALUES ('d'); 
GO 

问题是,最后插入 - 它抱怨说,

重复的值不能插入唯一索引。 [表名= Foo,约束名= FooConstraint]

这是意想不到的。我究竟做错了什么?

+0

种子不要用过于紧凑舒适; [它已被弃用,并有更好的选择](http://stackoverflow.com/a/20364011/61305)。 –

+1

@AaronBertrand我们仍然使用它,并会继续这样做,因为它非常方便。数据库只是一个文件,我可以复制它。我相信MS会以某种方式重新启动支持,因为没有为他们的平台提供进程内/单一文件数据库引擎是没有意义的。如果它在某个时候完全死亡,我们将转移到SQLite。 –

回答

1

您需要重置这样

ALTER TABLE [Foo] ALTER COLUMN [Id] IDENTITY (4, 1) 
+0

在您的CE工具箱应用程序中尝试了这一点 - 这非常棒! - 它的工作原理。谢谢。 –

+1

不客气 - 如果你喜欢我的工具,我会非常感激这里的评论:https://visualstudiogallery.msdn.microsoft.com/0e313dfd-be80-4afb-b5e9-6e74d369f7a1/view/Reviews – ErikEJ

+0

评论提交! :-) –