我想按条件删除数据。如果数据在另一个表中作为外键可用,则不要删除它

时间:2018-10-25 14:08:18

标签: php mysql codeigniter codeigniter-3

我有3个表,其中1个是供博客使用的,博客ID则存储在广告系列表中作为外键,并且在类别表中另存为外键(实际上是联结表)。

我希望当博客ID不在Compaign表中时,只需将其删除,但是当它在Compaign表中时,则不要删除它并粘贴错误。

通过我的代码:当我删除博客并使其数据在Compaign表中时,它只是从类别表(即博客表的联结表)中删除数据

这是我的模特

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在Compaign表中作为外键时,不要像显示错误消息那样删除此记录。

但是通过这段代码:当我这样做时,它会从类别表中删除博客的类别,在该类别表中,博客ID作为外键传递..(这是博客与另一个表的连接表)

2 个答案:

答案 0 :(得分:0)

您需要更改删除功能 就是这样

 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;
}

答案 1 :(得分:0)

您可以直接在数据库架构设计中执行此操作,而不是在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将阻止删除并返回错误。