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

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

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

  1. public function delete($id){
  2. if($id != $this->db->query("SELECT blogger_id FROM tbl_campaign_detail WHERE blogger_id = $id"))
  3. {
  4. $query=$this->db->query("DELETE FROM tbl_bloggers_cat WHERE blogger_id = $id AND Cat_id >2000");
  5. $this->db->where('blogger_id', $id);
  6. $this->db->delete('tbl_bloggers');
  7. if($this->db->affected_rows() > 0){
  8. return true;
  9. }else{
  10. return false;
  11. }
  12. }
  13. else
  14. {
  15. }
  16. }

这是我的控制器:

  1. public function delete($id){
  2. $result = $this->bm->delete($id);
  3. if($result){
  4. $this->session->set_flashdata('success_msg', 'Record deleted successfully');
  5. }
  6. else{
  7. $this->session->set_flashdata('error_msg', 'Fail to delete record');
  8. }
  9. redirect(base_url('blogger/index'));
  10. }

视图代码:

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

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

5jvtdoz2

5jvtdoz21#

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

  1. create table campaign (
  2. campaing_id serial not null,
  3. blogger_id integer not null,
  4. ....
  5. foreign key (blogger_id) references blogger (blogger_id) on delete restrict
  6. );

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

hmtdttj4

hmtdttj42#

您需要像这样更改delete函数

  1. function delete($id){
  2. $result = $this->db->query("SELECT blogger_id FROM tbl_campaign_detail WHERE blogger_id = $id")->row();
  3. if(!$result){
  4. $this->db->query("DELETE FROM tbl_bloggers_cat WHERE blogger_id = $id AND Cat_id > 2000");
  5. if($this->db->affected_rows() > 0){
  6. return true;
  7. }
  8. }
  9. return false;
  10. }

相关问题