我想根据条件删除数据如果另一个表中的数据作为外键可用,则不要删除此项

wgxvkvu9  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(273)

我有3个表,1个是bloggers表,blogger id作为外键保存在campaign表中,也作为外键保存在categories表中,实际上是连接表。
我希望当blogger id不在compign表中时,只需删除它,但当它在compign表中时,则不删除此项并粘贴错误。。
根据我的代码:当我删除blogger并且它的数据在compign表中时,它只是从categories表(blogger表的连接表)中删除数据
这是我的模型:

public function delete($id){

      if($id != $this->db->query("SELECT blogger_id FROM tbl_campaign_detail WHERE blogger_id = $id"))
    {
         $query=$this->db->query("DELETE FROM tbl_bloggers_cat WHERE blogger_id = $id AND Cat_id >2000");

        $this->db->where('blogger_id', $id);
        $this->db->delete('tbl_bloggers');
        if($this->db->affected_rows() > 0){
        return true;
        }else{
        return false;
        }
    }
    else
    {

    }

}

这是我的控制器:

public function delete($id){
    $result = $this->bm->delete($id);
    if($result){
        $this->session->set_flashdata('success_msg', 'Record deleted successfully');
    }
    else{
        $this->session->set_flashdata('error_msg', 'Fail to delete record');
    }
    redirect(base_url('blogger/index'));
}

视图代码:

<?php $id = $blogger->blogger_id;  ?>
                        <a href="<?php echo base_url('blogger/delete/'.$id); ?>" onclick="return confirm('Do you want to delete this record?');">
                            <span class="glyphicon glyphicon-trash"></span>
                        </a>

我希望当我删除blogger的记录,并且它的id作为外键在compign表中时,不要删除这个记录,如错误消息所示。
但是通过这个代码:当我这样做的时候,它会从类别表中删除blogger的类别,其中bloggers id作为外键传递(这是blogger和另一个表的连接表)

w41d8nur

w41d8nur1#

您需要像这样更改delete函数

function delete($id){
    $result = $this->db->query("SELECT blogger_id FROM tbl_campaign_detail WHERE blogger_id = $id")->row();
    if(!$result){
           $this->db->query("DELETE FROM tbl_bloggers_cat  WHERE blogger_id  = $id AND Cat_id > 2000");
           if($this->db->affected_rows() > 0){
                 return true;
            }
    }
    return false;
}
wgeznvg7

wgeznvg72#

您可以直接通过数据库模式设计来完成这项工作,而不是在php中完成。定义外键时,只需 on delete restrict :

create table campaign (
  campaing_id     serial   not null,
  blogger_id      integer  not null,
  ....
  foreign key (blogger_id) references blogger (blogger_id) on delete restrict
);

现在,如果您尝试删除表中的记录 blogger 但表中有子记录 campaign ,则mysql将阻止删除并返回错误。

相关问题