Каков наилучший способ удалить объединенную ассоциацию с сохраненным файлом в базе данных? - PullRequest
0 голосов
/ 09 июля 2010

Я хочу знать оператор (ы) sql, который нужно использовать для удаления старых данных и связи со старыми данными без удаления более важной родительской таблицы, которая должна существовать вечно.:

Step
  Id bigint
  OccurredOn datetime
  ScreenshotId bigint

Screenshot
  Id bigint
  Data varbinary(max)

Я хочу удалить все записи Screenshot s, связанные с Step s, где OccurredOn старше 30 дней.Step s будет по-прежнему сохраняться с нулевым значением ScreenshotId.

Каков наилучший оператор SQL для этого?

Ответы [ 2 ]

3 голосов
/ 09 июля 2010

Использование:

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 голос
/ 09 июля 2010

К сожалению, насколько я могу судить, вы не можете использовать цепочку предложений OUTPUT напрямую, но этот метод (живая версия) гарантирует, что вы фактически удалите только те строки скриншота, которые вы только что осиротели (так какв отличие от любых существующих сирот):

-- 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...