我有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作为外键传递..(这是博客与另一个表的连接表)
答案 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将阻止删除并返回错误。