更新db中的多个记录,这些记录尚未存在于表中

时间:2013-08-11 21:37:19

标签: sql codeigniter activerecord

我得到一个人就读的array()所学校。对于用户sarah@gmail.com,该数组有3个degree个已获得的奖励。我的桌子只有3个中的2个。

插入表中尚未出现的Sarah学位的最简单方法是什么?

开始表:

email            school    degree 

d@d.com          Yale      BA
d@d.com          Emery     PHD
a@a.com          ClownU    BS
sarah@gmail.com  Harvard   BA
sarah@gmail.com  Harvard   Masters

结束表:

email            school    degree 

d@d.com          Yale      BA
d@d.com          Emery     PHD
a@a.com          ClownU    BS
sarah@gmail.com  Harvard   BA
sarah@gmail.com  Harvard   Masters
sarah@gmail.com  Harvard   PHD

我考虑的选项:

  1. 删除所有莎拉的记录。重新插入所有莎拉的记录。
  2. 对于每条记录,查看是否存在。如果是的话,什么也不做,否则写下记录。
  3. 一些神奇的CI功能,如果某个特定记录不存在,那就是updates_batch或inserts_batch?

3 个答案:

答案 0 :(得分:1)

Insert Into [Start-Table] (email, school, degree)
(
select b.email, b.school, b.degree from [End-Table] b 
where NOT EXISTS (Select email, school, degree from [Start-Table]
                  where email = b.email and school = b.school and degree = b.degree)
)

答案 1 :(得分:0)

我遇到了同样的问题,你和我这样解决了这个问题: 1 - 删除所需用户的所有记录,然后像代码一样插入批处理。

           $employer_office        = $this->input->post('employer_office');
            $emp_job_type           = $this->input->post('job_type');
            $job_title              = $this->input->post('job_title');
            $job_appointment_date   = $this->input->post('job_appointment_date');
            $job_duration           = $this->input->post('job_duration');
            $job_place              = $this->input->post('job_place');
            $type_of_relation       = $this->input->post('type_of_relation');
            $monthly_salary         = $this->input->post('monthly_salary');
            $remarks                = $this->input->post('remarks');

            $all_array = array();

            if($employer_office)
            {
                if(is_array($employer_office))
                {

                   for($j=0; $j<count($employer_office); $j++)
                   {


                       $form_arr   = array(
                                    'employer_office'      =>$employer_office[$j],
                                    'job_type'             =>$emp_job_type[$j],
                                    'job_title'            =>$job_title[$j],
                                    'job_appointment_date' =>change_datei($job_appointment_date[$j]),
                                    'job_duration'         =>$job_duration[$j],
                                    'job_place'            =>$job_place[$j],
                                    'type_of_relation'     =>$type_of_relation[$j],
                                    'monthly_salary'       =>$monthly_salary[$j],
                                    'remarks'              =>$remarks[$j],
                                    'regdate'              =>date('Y-m-d H:m:s'),
                                    'userid'               =>$id
                                    );
                                    array_push($all_array, $form_arr);
                   }



                }
            }

            if($this->history_model->delete_all('ast_jobs_history',  $id)==TRUE)
            {
                if($this->history_model->all_insert('ast_jobs_history', $all_array)==TRUE)
                {
                    $this->session->set_flashdata("msg","<span class='m_success'>".$this->lang->line('global_update_success')."</span>");
                    redirect('history/home/list_dy','refresh');
                }
                else
                {
                    $this->session->set_flashdata("msg","<span class='m_error'>".$this->lang->line('global_update_error')."</span>");
                    redirect('history/home/list_dy','refresh');
                }
            }
            else
            {
                $this->load->view('unauthorized');
            }

并在模型中插入insert_batch。

        function all_insert($tbl, $data=array())
        {
            if(is_array($data))
            {
                $this->db->trans_start();
                $this->db->insert_batch($tbl,$data);
                $this->db->trans_complete();
                return TRUE;
            }
            else
            {
                return FALSE;
            }
        }

带来一些变化,我希望这会给你一个如何解决问题的提示。

或者如果您不想删除特定ID的记录,也可以进行查询, 根据ID获取数据并使用array_search()或in_array()函数过滤发布的数据并获取要插入的记录,然后将其插入数据库。

答案 2 :(得分:0)

如果要为记录保留相同的ID并不重要,只需删除并重新插入所有数据即可。如果要为旧记录保留相同的ID,也可以删除它,但是您首先要查询数据库以获取ID并使用它们创建数组。然后您可以插入所有新数据。

但如果我是你,我会创建一个查找数据库查找现有记录的函数。如果记录存在,则更新它。如果没有,它会创建一个新的。我认为这是解决这个问题最简洁的方法。