Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在需要恢复的事件行中保留主键_Sql_Sql Server_Tsql_Primary Key_Database Restore - Fatal编程技术网

Sql 在需要恢复的事件行中保留主键

Sql 在需要恢复的事件行中保留主键,sql,sql-server,tsql,primary-key,database-restore,Sql,Sql Server,Tsql,Primary Key,Database Restore,我有一个具有一对多和多对多关系的SQL数据库。大多数关系都基于自动递增字段“ID”。在某些情况下,当删除表中的行时,我会将多个表中的所有数据导出到XML文件,然后再从数据库中删除数据,以防以后需要恢复这些数据 如何处理数据库ID?我可以简单地将数据恢复到现有数据库中,并且ID和关系将保持不变吗 任何建议都将不胜感激。如果您在 SET IDENTITY_INSERT yourTable ON INSERT INTO yourTable ( id, field1, fi

我有一个具有一对多和多对多关系的SQL数据库。大多数关系都基于自动递增字段“ID”。在某些情况下,当删除表中的行时,我会将多个表中的所有数据导出到XML文件,然后再从数据库中删除数据,以防以后需要恢复这些数据

如何处理数据库ID?我可以简单地将数据恢复到现有数据库中,并且ID和关系将保持不变吗


任何建议都将不胜感激。

如果您在

SET IDENTITY_INSERT yourTable ON

INSERT INTO
  yourTable (
    id,
    field1,
    field2
  )
SELECT
  id,
  field1,
  field2
FROM
  yourBackup

SET IDENTITY_INSERT yourTable OFF
请注意,必须在INSERT语句中指定所有字段,包括ID



一旦用主键重新创建了记录,就可以在将它们用作外键的表中重新创建记录。

简短回答:是。SQL Server中有一个针对每个表设置的标志,指示是否允许为标识列指定值。默认情况下,它处于关闭状态。重新插入数据时,您需要临时启用它:

DECLARE @Id int
DECLARE @Name varchar(20) = 'Dave'


INSERT INTO Example(Name) VALUES(@Name)

SET @Id = SCOPE_IDENTITY()

DELETE FROM Example WHERE Id = @Id


SET IDENTITY_INSERT Example ON

INSERT INTO Example(Id, Name) VALUES(@Id, @Name)

SET IDENTITY_INSERT Example OFF
请注意,为了满足任何外键关系,您需要将数据重新插入到“多”表之前的“一”表中