我有两张桌子,游戏和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类似
答案 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查询,那么它也可能像创建或修改基类一样简单,以注入省略软删除行的条件。