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
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
(输出在前面)对不起。我已经做了太多的合并语句,输出在合并语句的末尾:/响应已经更新。