【问题标题】:Insert multiple records in table if IDs do not exist in table如果表中不存在 ID,则在表中插入多条记录
【发布时间】:2014-12-20 07:56:41
【问题描述】:

如果员工 ID 不存在于表中,我想为多个员工在单个表中添加多条记录。我在数组中有员工 ID。

Array ( [0] => Array ( [EmployeeID] => 1 ) [1] => Array ( [EmployeeID] => 2 ) )

现在我有一个表,我想检查员工的记录是否存在,如果某些员工的记录不存在,则不要插入,然后插入。

例如,我有桌子。

INSERT INTO timesheet (employee_id,date_created) Values (1,2014-12-20),(2,2014-12-20) where employee_id NOT IN (1,2)

我知道我写的上面的查询是不对的,但这就是为什么我想问只有当该特定 ID 的记录不存在时如何插入到表中。

我正在使用codeigniter,如果您也知道codeigniter 方式,那就太好了。但是简单的mysql 查询帮助也可以为我工作。

【问题讨论】:

    标签: php mysql codeigniter


    【解决方案1】:

    尝试像这样使用NOT EXIST 子句:

    INSERT INTO timesheet (employee_id,date_created) 
    select 1,'2014-12-20'
    from dual
    WHERE NOT EXISTS (
       SELECT * 
       FROM timesheet 
       WHERE employee_id in (1)
    );
    

    对于多行,你必须添加如下的虚拟行(或者只执行循环中的前一个语句)

    INSERT INTO timesheet (employee_id,date_created) 
    select * from (
        select 1 AS ID,'2014-12-20'
        union all 
        select 2 AS ID, '2014-12-20'
        union all 
        select 3 AS ID, '2014-12-20'
    ) t
    WHERE NOT EXISTS (
       SELECT * 
       FROM timesheet 
       WHERE employee_id = t.ID
    );
    

    Demo Fiddle

    感谢Spock 指正! :)

    【讨论】:

    • 可以不使用子查询直接使用不存在吗??我的意思是 WHERE NOT EXIST(1,2) 等??
    • 我不这么认为,因为您想比较表中的现有行。根据你的期望直接指定where not exist(1,2)——想想应该和哪一列匹配?
    • 是的@Spock,恐怕他需要运行多个查询。让我更新答案!
    • @SizzlingCode。是的,但只有如果employee_idtimesheet 表上的主键。是吗 ? (我认为它不会是时间表表的主键)。
    • 不,它不是主键,但它是外键。我想我将不得不遵循 php 的方式。我的意思是选择不在表中的员工 ID,然后进行插入以从大量查询中保存。
    【解决方案2】:

    首先确保employee_id 是主键和/或唯一索引。然后,您可以使用ON DUPLICATE KEY UPDATE

    将此作为参考:MySQL - insert if doesn't exist yet

    【讨论】:

      【解决方案3】:
      $data=Array ( Array ( 'EmployeeID' => 1 ),Array ( 'EmployeeID' => 2 ) );
       echo '<pre>';
       print_r($data);
       foreach ($data as $key => $value) {
          echo $str="INSERT INTO timesheet (employee_id,date_created) Values (1,2014-12-20),(2,2014-12-20) where employee_id NOT IN ($key)";
          echo '<br>';
       }
      

      【讨论】:

        猜你喜欢
        • 2014-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-11
        • 2021-09-03
        • 2018-12-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多