Sql 插入件上的内部连接确保完整性

Sql 插入件上的内部连接确保完整性,sql,sql-server,stored-procedures,transactions,Sql,Sql Server,Stored Procedures,Transactions,我正在将数据从一个表复制到另一个表。我想知道什么能更好地维护数据完整性和性能 步骤: 将超过x天的数据从日志复制到存档 从日志中删除存档中存在的数据 来自 INSERT INTO archive SELECT * FROM logs WHERE datediff(day, logs.timestamp, GetDate()) > @day DELETE logsf FROM logs As logsf INNER JOIN archive as archivef

我正在将数据从一个表复制到另一个表。我想知道什么能更好地维护数据完整性和性能

步骤

  • 将超过x天的数据从日志复制到存档
  • 从日志中删除存档中存在的数据
  • 来自

    INSERT INTO archive
        SELECT * FROM logs
        WHERE datediff(day, logs.timestamp, GetDate()) > @day
    
    DELETE logsf FROM logs As logsf
        INNER JOIN archive as archivef ON logsf.uuid = archivef.uuid
        WHERE datediff(day, logsf.timestamp, GetDate()) > @jour        
    

    INSERT INTO archive
        SELECT * FROM logs
        WHERE datediff(day, logs.timestamp, GetDate()) > @day
        AND NOT EXISTS (
            SELECT * FROM archive
            WHERE datediff(day, logs.timestamp, GetDate()) > @day
        )
    
    
    DELETE logsf FROM logs As logsf
        INNER JOIN archive as archivef ON logsf.uuid = archivef.uuid
        WHERE datediff(day, logsf.timestamp, GetDate()) > @jour       
    
  • 这样做是否有助于确保您不试图在表中插入现有数据
  • 如果我的两个原始查询在一个事务中,那么我的第二个选项是否毫无意义(并且增加了无用的处理时间) 您会使用哪一种:

    如果不存在则插入+如果存在则删除(独立)

    无错误时插入和删除(事务)

    兼而有之


    为什么呢?

    我会选择选项2,因为这是一个更快的过程,因为SQL不那么复杂


    我更喜欢将其包装在事务中,以便在出现任何错误时进行回滚。

    我会选择选项2,因为这将是一个更快的过程,因为SQL不太复杂


    我更喜欢将其包装到事务中,以便在出现任何错误时进行回滚。

    使用SQL Server,您可以使用将删除的项目直接放入存档表中:

    DELETE logs
        OUTPUT deleted.* INTO archive
        WHERE datediff(day, timestamp, GetDate()) > @jour  
    

    使用SQL Server,您可以使用将删除的项目直接放入存档表:

    DELETE logs
        OUTPUT deleted.* INTO archive
        WHERE datediff(day, timestamp, GetDate()) > @jour  
    

    谢谢,我同意了这个建议,并以一个非常简短的查询结束:)(但是,语法似乎是
    DELETE logs OUTPUT deleted.*从日志中的归档文件,其中datediff(day,logs.timestamp,GetDate())>@jour
    (OUTPUT before FROM))对不起。我已经做了太多的合并语句,输出在合并语句的末尾:/响应已经更新。谢谢,我接受了这个建议,最后得到了一个非常简短的查询:)(但是,语法似乎是
    DELETE logs OUTPUT deleted.*从日志到归档,其中datediff(day,logs.timestamp,GetDate())>@jour
    (输出在前面)对不起。我已经做了太多的合并语句,输出在合并语句的末尾:/响应已经更新。