MySQL" IF(SELECT为空)然后插入" - 解决方案

时间:2018-03-27 14:42:54

标签: php mysql sql

我正在开发一种工具来记录工人的来来往往时间。这些时间记录在一个mysql表中。

该表有一个come和一个gone字段,用于在工人来或离开时进行注册。 只有新的条目,如果所有" old"条目已关闭,表示工人已经签出。

我认为应该是这样的:

   IF EXISTS (  SELECT * FROM tbl_card
            WHERE time_gone IS NULL
            AND user_id=".$user_id." 
            )
            THEN
            BEGIN

            END
            ELSE BEGIN
              INSERT 
              INTO tbl_card (`user_id`, `time_come`) 
              VALUES ('2', '2018-01-01 14:00')
             END 

有没有人知道这应该如何运作?

我使用php来查询mysql。 Php允许定义" if-conditions",因此我在SELECT * FROM tbl_card...中分隔查询并测试rowcount是否为' 0'然后我执行了插入。

但是:一位用户设法使用第一次和第二次查询之间的微秒来签到两次。 :(

用于LAMP环境。 在此之前:

  $sql = "SELECT * FROM tbl_card WHERE time_gone IS NULL
                  AND user_id=".$user_id;
    $result = $db_conn->query($sql);

    if ($result->num_rows <> 0)
    { 
      return 'You already checked in!'; 
    }
    else
    {
    $sql = "INSERT 
              INTO tbl_card(`user_id`, `time_come`) 
              VALUES ('".$user_id."', '".$timestamp."')";

    if ($db_conn->query($sql)){
    return 'Check in: '.$timestamp;} 
    else
      { 
        return 'Something strange happend!';
      }
    }

表格是:

   tbl_card -> id, user_id, time_come, time_gone
   tbl_user -> id, name

3 个答案:

答案 0 :(得分:4)

尝试单个插入/选择:

INSERT INTO card (`user_id`, `time_come`) 
SELECT '2', '2018-01-01 14:00'
WHERE NOT EXISTS
 ( SELECT * FROM punchclock
   WHERE time_gone IS NULL
     AND user_id=".$user_id." 
 )

答案 1 :(得分:1)

INSERT INTO tbl_card (`user_id`, `time_come`)
SELECT * FROM (SELECT '2', '2018-03-27 15:15') AS tmp
WHERE NOT EXISTS (
    SELECT * FROM tbl_card
        WHERE `time_gone` IS NULL
        AND `user_id`=`2`
) LIMIT 1;

参见相关文章: MySQL: Insert record if not exists in table

答案 2 :(得分:0)

感谢 dnoeth 指导我找到最终解决方案:

INSERT INTO tbl_card (`user_id`, `time_come`) 

  SELECT '2', '2018-01-01 14:00' FROM dual
  WHERE NOT EXISTS
   ( 
     SELECT * FROM tbl_card
     WHERE time_gone IS NULL
     AND user_id=".$user_id."
   )

dual 是一个虚拟表,在mysql中实现,不需要表。

这个解决方案模拟了来自另一个表的数据插入,这个数据并不是真正存在的,只有静态的值&#39; 2&#39;和&#39; 2018-01-01 14:00&#39;对于每一行。行的数量由查询的WHERE部分给出。

有时候mysql和它的用户会让我感到惊讶。 :d 我想知道为什么我不需要&#34; VALUES&#34; -command,但它运行良好。

让我们看看用户是否可以&#34;覆盖&#34;该查询也是:D