删除另一个表引用的表中的条目

时间:2015-11-20 15:30:00

标签: sql sql-server database function

我有两张桌子,游戏和Sport_Games。 Sport_Games有一个引用游戏的外键。

现在,当我想从游戏中删除条目时,我收到错误消息:

  

“FK__Sport_Gam__game ___ 1D7C2B7C”。冲突发生在数据库“DatabasesProject”,表“dbo.Sport_Games”,列“game_id”中。   声明已经终止。

我假设这是因为我无法从具有约束的表中删除某些内容而不删除它。我尝试在表格游戏中添加ON DELETE CASCADE,希望当我删除游戏时,它也会从Sport_Games中删除,但这也不起作用。

以下表格供参考:

subprocess.check_output()

我还有其他表引用了游戏,action_games,strategy_games,但它们与sport_games类似

3 个答案:

答案 0 :(得分:1)

如果您知道要删除的记录的GameID,只需删除Sport_Games表中首先具有相同GameID的记录,然后从Games表中删除。

要使级联工作,您需要将其添加到Sport_Games表上的FK定义中。这样,当删除游戏记录时,sport_Games记录也将被删除。

答案 1 :(得分:0)

如果您将ON DELETE CASCADE放在正确的外键上,则DELETE FROM Sport_Games WHERE Game_ID = [The id you are using to delete from Games] 将对您有效。但要回答你的问题...

由于Games.Game_ID具有针对Sport_Games.Game_ID的约束引用,您需要关闭约束以使其不会阻止您删除,但这会在您删除父项之前留下孤儿或删除子项。由于您必须已知道删除父项的PK值,因此您只需:

DELETE FROM Games WHERE Game_ID = [Same id used above]

然后删除父级:

//Handle box opening and closing
var boxcontent_width = $(".box-content").css("width");
$(".boxarrow").addClass("done");

$(document).on("click",".boxarrow", function(event){
    var serial = $(this).parent().parent().attr("serial");
    var clink = $(document).find("[comment-link='"+serial+"']");
    if(clink.hasClass("open")){
        clink.click();
    }

    if($(this).hasClass("done")){
        $(this).removeClass("done");
        $(document).find("#comment-box"+$(this).parent().parent().attr("serial")).slideUp(250);
        if($(this).parent().parent().find(".box-content").is(":hidden")){
            $(this).attr("src","source/up_arrow.png");
        }else{
            $(this).attr("src","source/down_arrow.png");
        }
        $(this).parent().parent().find(".box-content").slideToggle(500,function(){
            $(this).parent().find("div img").addClass("done");
        });            

    }
    return false;

}); 
//Handle votes
$(document).on("click","#positive-button, #negative-button", function(event){
    var serial = $(this).parents(".tutorial-box").attr("serial");
    var vote = 0;
    if($(this).attr("id") == "positive-button"){
        vote = 1;   
    }

    $.post("vote.php",{
        php_tutorial_id: serial,
        php_vote_value: vote
    },function(data){
        if(data.localeCompare("error") && data){
            if(data > 9999)data = 9999;
            if(data < -9999)data = -9999;
            if(data > 0){
                data = "+"+data;
            }
            $("#tutorial-vote"+serial+" p").fadeOut(250, function(){
                $("#tutorial-vote"+serial+" p").html(data).fadeIn(250);
            });
        }
    });
    return false;
});

//Handle comment opening and closing
$(document).on("click",".showcomments", function(event){
    if($(this).hasClass("open")){
        $(this).html("<p>Show comments</p>");
        $(this).removeClass("open");
    }else{
        $(this).html("<p>Hide comments</p>");
        $(this).addClass("open");
    }
    var clink = $(this).attr("comment-link");
    var is_open = $(this).hasClass("open");
    $(this).parents().find("#"+clink).slideToggle(500);
    return false;
});

//Handle add comment button
$(document).on("click",".comment-button", function(event){
    var serial = $(this).attr("serial");
    serial = "#comment-box"+serial;
    $(document).find(".comment-box").not(serial).slideUp(250);
    $(document).find(serial).slideToggle(250);
    return false;   
});
$(document).on("click",".comment-box-submit", function(event){  
    var tutorial_id = $(this).parent().attr("serial");
    var comment_text = $(this).parent().find(".comment-box-area");
    var serial = $(this).parent().attr("serial");
    $.post("send_comment.php",{
        php_tutorial_id: tutorial_id,
        php_comment_text: comment_text.val()
    },function(data){
        $(document).find("#comment-response"+serial).fadeOut(500, function(){
            if(data){
                $(document).find("#comment-response"+serial).html(data);
                $(document).find("#comment-response"+serial).fadeIn(500);
            }else{
                $(document).find("#comment-response"+serial).html("");
                $.post("reflesh_comments.php",{
                    php_tutorial_id: tutorial_id
                },function(data){
                    if($(document).find("#"+tutorial_id).is(":hidden")){
                        $(document).find("#"+tutorial_id).html(data);
                    }else{
                        $(document).find("#"+tutorial_id).fadeOut(500, function(){
                            $(document).find("#"+tutorial_id).html(data);
                            $(document).find("#"+tutorial_id).fadeIn(500);  
                        });

                    }

                });
                $(document).find("#comment-response"+serial).html("");
                comment_text.val("");
            }   
        });     
    }); 
    return false;
});
$(document).on("click",".comment-remove", function(event){  
    var serial = $(this).attr("serial");
    var tutorial_serial = $(this).parent().parent().parent().attr("id");
    $("#overlay-box").load("overlay_boxes/remove_comment.php", { php_serial: serial, php_tutorial_serial: tutorial_serial }, function(){
        $("#overlay-box").fadeIn(250);
        $("#overlay").fadeIn(250);

    });
    return false;
});


$(document).on("click",".comment-reply", function(event){
    var serial = $(this).parent().parent().attr("serial");
    var owner = $(this).parent().parent().find(".comment-owner").html();
    var owner_id = $(this).attr("serial");
    $(document).find("#comment-box"+serial).find(".comment-response").hide();
    $(document).find("#comment-box"+serial).slideDown(250); 
    $(document).find("#comment-box"+serial).find(".comment-box-area").val("@"+owner+": ");
    $(document).find("#comment-box"+serial).find(".comment-box-area").focus();
    return false;
});

$(document).on("click",".comment-report", function(event){  
    var serial = $(this).attr("serial");
    var tutorial_serial = $(this).parent().parent().parent().attr("id");
    $("#overlay-box").load("overlay_boxes/report_comment.php", { php_serial: serial }, function(){
        $("#overlay-box").fadeIn(250);
        $("#overlay").fadeIn(250);
    });
    return false;
});

答案 2 :(得分:0)

我要说的可能不会直接回答你的问题,但它对你前进或未来的设计可能是有益的。

我发现在表中放置“delete_date”和“delete_id”是解决这些FK约束问题的有效方法。如果您的应用程序只调用现有的存储过程和表函数,则可以更新查询以在其条件中包含“AND delete_date IS NULL”。如果您的应用程序正在编写adhoc查询,那么它也可能像创建或修改基类一样简单,以注入省略软删除行的条件。