2010-07-09 23 views
0

我想知道用於刪除舊數據和舊數據的關聯的sql語句,而不刪除更重要的父表,它應該永遠生活。將加入的關聯刪除到數據庫中的存儲文件的最佳方法是什麼?

我有以下表格:

Step 
    Id bigint 
    OccurredOn datetime 
    ScreenshotId bigint 

Screenshot 
    Id bigint 
    Data varbinary(max) 

我想刪除與Step S其中OccurredOn超過30天相關聯的所有Screenshot小號記錄。 Step仍然會保留爲空ScreenshotId

什麼是最好的SQL語句來做到這一點?

+5

您可能有你的關係/外鍵字段在錯誤的表上。從你的解釋看來,也許你想在屏幕截圖上放置一個StepId字段,而不是在步驟表上放置一個ScreenShotId字段。 – Tahbaza 2010-07-09 00:13:14

+0

這是一對一的關係,所以我想我可以做到這一點。你是說我應該這樣做,以便刪除它們更容易?或者改變關係還有其他好處嗎? – 2010-07-12 13:16:47

回答

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

請注意,DATEADD函數將返回一個包含時間部分的日期時間(準確到〜3 ms?)。 – 2010-07-09 00:21:17

+0

現在看來如此明顯,我看到了答案。非常感謝。 – 2010-07-09 21:04:37

1

不幸的是,據我所知,你不能使用OUTPUT子句直接鏈接,但this method (live runnable version),保證讓你實際上只刪除剛剛成爲孤兒的任何截圖行(而不是任何現有的孤兒):

-- 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 
+0

+1:Thx用於捕捉我的錯字 – 2010-07-09 22:14:16

相關問題