Mysql 删除具有外键约束的行
我有一个讲师表,其FileId列对应于Files表中的一个文件。当他/她替换文件时,我希望能够删除旧文件。我不想删除讲师条目,只想删除文件。当我编辑关系,使其允许在更新和删除时级联,然后我运行下面的存储过程,删除了讲师条目,这不是期望的效果,如果您有任何建议,请告诉我。 谢谢你的帮助Mysql 删除具有外键约束的行,mysql,Mysql,我有一个讲师表,其FileId列对应于Files表中的一个文件。当他/她替换文件时,我希望能够删除旧文件。我不想删除讲师条目,只想删除文件。当我编辑关系,使其允许在更新和删除时级联,然后我运行下面的存储过程,删除了讲师条目,这不是期望的效果,如果您有任何建议,请告诉我。 谢谢你的帮助 ALTER PROC [dbo].[Files_DeleteByInstructorFileId] @Id int, @FileId int = NULL as begin
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
请确保在删除和更新时将引用列(外键约束)设置为级联。
像
请确保在删除和更新时将引用列(外键约束)设置为级联。
像
我找到了一个解决方案:我首先声明了一个等于讲师的fileId的变量,然后将fileId设置为null,这样我就可以删除该文件,而不受外键约束的限制,然后使用该变量找到要删除的正确文件。如果有其他的方法,我还是会感兴趣的
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
我找到了一个解决方案:我首先声明了一个等于讲师的fileId的变量,然后将fileId设置为null,这样我就可以删除该文件,而不受外键约束的限制,然后使用该变量找到要删除的正确文件。如果有其他的方法,我还是会感兴趣的
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
所以我对SQL非常陌生,只是在学习,所以你是说在更新关系设计之后,我应该将你上面写的内容添加到存储过程中,而不是我正在使用的删除逻辑?你可以编写相同的查询来删除行,但是当你创建外键时,默认情况下它是受限的,或者在删除/更新时不执行任何操作。现在您必须将其更改为CASCADE,然后它将允许删除引用的列。您可以再次使用queryshowcreatetable_-NAMEHi查看当前操作,因此当我尝试此操作时,结果是整个讲师条目被删除。我试图从对应于特定讲师的文件表中删除该文件,但如果这有任何意义,则不删除讲师…显然,删除查询将删除整行而不是单个值。如果要删除单个值,则意味着要更新列值,因此请使用“更新”而不是“删除查询”。然后设置你想要的,它将替换上一个。所以我刚刚开始学习SQL,所以你是说在更新关系设计之后,我应该将你上面写的内容添加到存储过程中,而不是我正在使用的删除逻辑?你可以编写相同的查询来删除一行,但是,当您创建外键时,默认情况下它是受限的,或者在删除/更新时不执行任何操作。现在您必须将其更改为CASCADE,然后它将允许删除引用的列。您可以再次使用queryshowcreatetable_-NAMEHi查看当前操作,因此当我尝试此操作时,结果是整个讲师条目被删除。我试图从对应于特定讲师的文件表中删除该文件,但如果这有任何意义,则不删除讲师…显然,删除查询将删除整行而不是单个值。如果要删除单个值,则意味着要更新列值,因此请使用“更新”而不是“删除查询”。并设置你想要的,它将取代前一个。