【问题标题】:Retain primary keys in event rows needs to be restored保留事件行中的主键需要恢复
【发布时间】:2012-04-26 12:27:48
【问题描述】:

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

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

任何建议将不胜感激。

【问题讨论】:

    标签: sql sql-server tsql primary-key database-restore


    【解决方案1】:

    如果您使用SET IDENTITY_INSERT [table] ON,您可以重新插入数据,甚至可以插入到 IDENTITY 字段中

    SET IDENTITY_INSERT yourTable ON
    
    INSERT INTO
      yourTable (
        id,
        field1,
        field2
      )
    SELECT
      id,
      field1,
      field2
    FROM
      yourBackup
    
    SET IDENTITY_INSERT yourTable OFF
    

    请注意,您必须在 INSERT 语句中指定所有字段,包括 ID。


    使用主键重新创建记录后,您可以在使用它们作为外键的表中重新创建记录。

    【讨论】:

      【解决方案2】:

      简短的回答:是的。 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
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-10
        • 2021-03-08
        • 2019-04-24
        • 1970-01-01
        • 2013-09-14
        • 1970-01-01
        • 2016-04-12
        相关资源
        最近更新 更多