2016-01-31 41 views
0

我有一个教师表,其中有一列FileId对应于Files表中的文件。当他/她替换一个文件时,我希望能够删除旧文件。我不想删除教师条目,只是文件。当我编辑关系,以便它允许更新和删除级联,然后我运行存储的proc下面它删除教师条目,这不是所需的效果,请让我知道如果您有任何建议。 感谢您的帮助使用外键约束删除行

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

您可以编写相同的查询来删除一行,但是当您创建外键时,默认情况下,它是RESTRICTED或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