Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 删除具有外键约束的行_Mysql - Fatal编程技术网

Mysql 删除具有外键约束的行

Mysql 删除具有外键约束的行,mysql,Mysql,我有一个讲师表,其FileId列对应于Files表中的一个文件。当他/她替换文件时,我希望能够删除旧文件。我不想删除讲师条目,只想删除文件。当我编辑关系,使其允许在更新和删除时级联,然后我运行下面的存储过程,删除了讲师条目,这不是期望的效果,如果您有任何建议,请告诉我。 谢谢你的帮助 ALTER PROC [dbo].[Files_DeleteByInstructorFileId] @Id int, @FileId int = NULL as begin

我有一个讲师表,其FileId列对应于Files表中的一个文件。当他/她替换文件时,我希望能够删除旧文件。我不想删除讲师条目,只想删除文件。当我编辑关系,使其允许在更新和删除时级联,然后我运行下面的存储过程,删除了讲师条目,这不是期望的效果,如果您有任何建议,请告诉我。 谢谢你的帮助

   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查看当前操作,因此当我尝试此操作时,结果是整个讲师条目被删除。我试图从对应于特定讲师的文件表中删除该文件,但如果这有任何意义,则不删除讲师…显然,删除查询将删除整行而不是单个值。如果要删除单个值,则意味着要更新列值,因此请使用“更新”而不是“删除查询”。并设置你想要的,它将取代前一个。