从备份中复制SQL记录并插入数据库,并保留主键

时间:2018-09-21 15:20:07

标签: sql sql-server

我需要在已删除的表中恢复一行。我在数据库的备份副本中有该行。我知道我可以从一个数据库复制/粘贴到另一个数据库,但是(显然)这样做不能保留主键值,因此它看起来像是一条新记录。

如何将这一行插入表中并保留原始主键值(唯一)?还有其他表引用此keyid,因此这样做将避免我们不得不在其他位置进行更改。

3 个答案:

答案 0 :(得分:2)

假定这是一个IDENTITY列(它执行自动递增的INT / BIGINT插入),则需要运行SET IDENTITY_INSERT命令。

SET IDENTITY_INSERT dbo.MyTable ON;

INSERT INTO dbo.MyTable (Id, Columns) SELECT Id, Columns FROM BackupDb.dbo.MyTable WHERE Id = DeletedRowID 

SET IDENTITY_INSERT dbo.MyTable OFF;

以下是与此命令https://docs.microsoft.com/en-us/sql/t-sql/statements/set-identity-insert-transact-sql相关的MS Doc

任何其他类型的主键(例如,由NEWID()填充的唯一标识符)都不需要打开IDENTITY_INSERT。

还要注意,一次只能打开1个表IDENTITY_INSERT,并且发出命令的帐户必须拥有该表或对该表具有ALTER权限。

答案 1 :(得分:0)

假设您的桌子是这样设置的

create table tableWithAutoId (id int identity(1,1) primary key, val varchar(50))

仅执行此操作(这基本上就是您想要的)

insert into tableWithAutoId(id, val)values(1,'abc')
  

当IDENTITY_INSERT设置为OFF时,无法在表'tableWithAutoId'中为标识列插入显式值。

但是,如果先打开Identity_insert,则可以忽略列上的Identity属性

set identity_insert tableWithAutoId ON
insert into tableWithAutoId(id, val)values(1,'abc')

完成后,请务必将其关闭。

set identity_insert tableWithAutoId ON

答案 2 :(得分:-2)

插入(列列表) 从中选择(列列表) 其中=值