删除与数据库中存储文件的连接关联的最佳方法是什么?

时间:2010-07-09 00:01:57

标签: sql sql-server tsql

我想知道用于删除旧数据的sql语句以及与旧数据的关联,而不删除应该永远存在的更重要的父表。

我有以下表格:

Step
  Id bigint
  OccurredOn datetime
  ScreenshotId bigint

Screenshot
  Id bigint
  Data varbinary(max)

我想删除与Screenshot超过30天的Step相关联的所有OccurredOn条记录。 Step仍然会保留为ScreenshotId

执行此操作的最佳SQL语句是什么?

2 个答案:

答案 0 :(得分:3)

使用:

UPDATE STEP
   SET screenshotid = NULL
 WHERE occurredon < DATEADD(dd, -30, GETDATE())

DELETE FROM SCREENSHOT
 WHERE NOT EXISTS(SELECT NULL
                    FROM STEP s
                   WHERE s.screenshotid = id)

答案 1 :(得分:1)

不幸的是,据我所知,你不能直接使用OUTPUT子句链接,但是this method (live runnable version)确保你只会删除你刚刚孤立的任何截图行(而不是任何现有的孤儿): / p>

-- SO3208939
CREATE TABLE #Screenshot (
    Id bigint IDENTITY(100000, 10) NOT NULL
    ,Data varbinary(max) NULL
)

CREATE TABLE #Step (
    Id bigint IDENTITY NOT NULL
    ,OccurredOn datetime NOT NULL
    ,ScreenshotId bigint NULL REFERENCES #Screenshot(Id)
)

INSERT INTO #Screenshot DEFAULT VALUES
INSERT INTO #Step VALUES ('1/1/2010', @@IDENTITY)
INSERT INTO #Screenshot DEFAULT VALUES
INSERT INTO #Step VALUES ('2/1/2010', @@IDENTITY)
INSERT INTO #Screenshot DEFAULT VALUES
INSERT INTO #Step VALUES ('3/1/2010', @@IDENTITY)
INSERT INTO #Screenshot DEFAULT VALUES
INSERT INTO #Step VALUES ('4/1/2010', @@IDENTITY)
INSERT INTO #Screenshot DEFAULT VALUES
INSERT INTO #Step VALUES ('5/1/2010', @@IDENTITY)
INSERT INTO #Screenshot DEFAULT VALUES
INSERT INTO #Step VALUES ('6/1/2010', @@IDENTITY)
INSERT INTO #Screenshot DEFAULT VALUES
INSERT INTO #Step VALUES ('7/1/2010', @@IDENTITY)
INSERT INTO #Screenshot DEFAULT VALUES
INSERT INTO #Step VALUES ('8/1/2010', @@IDENTITY)

-- SELECT * FROM #Screenshot
-- SELECT * FROM #Step

DECLARE @Deleted AS TABLE (Id bigint NOT NULL)

UPDATE #Step
SET ScreenshotId = NULL
OUTPUT DELETED.ScreenshotId
INTO @Deleted
WHERE OccurredOn < DATEADD(dd, -30, GETDATE())

DELETE FROM #Screenshot
WHERE Id IN (SELECT Id FROM @Deleted)

-- SELECT * FROM #Step
SELECT * FROM #Screenshot
相关问题