2016-01-31 2 views
0

У меня есть таблица инструкторов со столбцом FileId, который соответствует файлу в таблице Files. Когда он/она заменяет файл, я хочу, чтобы он мог уйти и удалить старый. Я НЕ хочу удалить запись Instructor, просто файл. Когда я отредактировал отношения так, чтобы они разрешали каскады при обновлении и удалении, а затем я запустил хранимый процесс, который он удалил в записи инструктора, что не является желаемым эффектом, сообщите мне, если у вас есть какие-либо предложения. Спасибо за вашу помощьУдаление строки с ограничением внешнего ключа

ALTER PROC [dbo].[Files_DeleteByInstructorFileId] 
    @Id int, 
    @FileId int = NULL 

    as 
    begin 

    /* 

    EXECUTE [dbo].[Files_DeleteByInstructorFileId] 162 

    */ 

    Update [dbo].[Instructors] SET 

     FileId = @FileId 
     WHERE @Id = Id 

     DELETE f FROM [dbo].[Files] f 
     JOIN [dbo].[Instructors] ins 
     ON ins.FileId = f.Id 

     WHERE ins.Id = @Id 


    END 

ответ

2

Пожалуйста, убедитесь, что ссылки колонке (ограничения внешнего ключа) устанавливается как CASCADE на удаление и обновление.
как

CONSTRAINT `job_status_ibfk_1` FOREIGN KEY (`jobseeker_id`) 
REFERENCES `jobseeker` (`jobseeker_id`) ON DELETE CASCADE ON UPDATE CASCADE 
+0

Так что я очень новичок в изучении SQL, поэтому вы говорите, что после обновления дизайна отношений я должен добавить то, что вы написали выше в хранимую процедуру вместо используемой мной логики удаления? – ranah

+0

Вы можете написать тот же запрос, чтобы удалить строку, но когда вы делаете внешний ключ, тогда по умолчанию он отключен или NO ACTION при удалении/обновлении. теперь вы должны изменить его на CASCADE, тогда он позволит удалить столбец с ссылкой. Вы можете увидеть свое текущее действие, используя запрос SHOW CREATE TABLE TABLE_NAME –

+0

Привет, опять же, когда я пробовал это, все закончилось тем, что вся запись инструктора была удалена. Я пытаюсь просто удалить файл из таблицы файлов, который соответствует этому конкретному преподавателю, но не удалять инструктора, если это имеет смысл ... – ranah

1

Я нашел решение: я первый объявлена ​​переменная, равная FILEID инструктора, а затем я установил FILEID обнулить, чтобы я мог удалить файл и не может быть ограничено ограничением внешнего ключа, то я использовал переменную, чтобы найти правильный файл для удаления. Если есть другие способы сделать это, мне все равно будет интересно ...

DECLARE @FileIdNumber int 
SELECT @FileIdNumber = [dbo].[Instructors].[FileId] 
FROM [dbo].[Instructors] 
WHERE [dbo].[Instructors].[Id] = @Id 

Update [dbo].[Instructors] SET 

FileId = @FileId 
WHERE @Id = Id 

DELETE f FROM [dbo].[Files] f 
WHERE f.Id = @FileIdNumber 
Смежные вопросы