避免重复输入INSERT SQL

时间:2018-04-20 22:01:17

标签: php sql

我插入每日出勤率。我想避免重复的条目。唯一列应该是月,日和ID。 我的条件是"如果该员工ID存在月份和日期(例如,如果员工#40已经在3月22日出席),则应该返回错误并且不应该继续插入。这是我的代码。

    $avoid_double_entry = query("SELECT * FROM attendance WHERE 
    employee_id = '$employee_id' AND month = '$month' AND day = '$day' ");
    confirm($avoid_double_entry);

    if($row = fetch_array($avoid_double_entry)) {
            echo "already exists";
    } else {
        echo "no records found";
     <--proceed to insert query-->

但是,当我运行此代码时,以及第22天的条目,即使月份不是3月,员工ID也不是40,它表示已经存在。它也发生在当天不是22但月份是3月,反之亦然。

它只表示在不满足这三个条件时没有找到记录。我有点理解这一部分。我不明白为什么它已经存在,即使只满足一个条件。在此先感谢您的帮助。

我已经尝试过不查询WHERE NOT,DUPLICATE KEY UPDATE,但仍然无法弄清楚..

顺便说一下,这是我的确认功能,它运行正常,但以防万一。

 function confirm($result) {

global $connection;

if(!$result) {

    die("Query failed" . mysqli_error($connection)); 
}

}

1 个答案:

答案 0 :(得分:0)

在执行SELECT查询之前,您不需要执行INSERT查询以防止重复输入。

您需要create a unique index over the multiple columns that must be unique in your table.

然后,执行INSERT查询。不会插入重复项。如果遇到重复项时有其他列应更新,则可以使用ON DUPLICATE KEY UPDATE。否则INSERT IGNORE将阻止您在尝试插入重复项时(但仍未插入重复项)时出现任何错误。

此外,我强烈建议您将日期存储在单个日期类型列中,而不是将不同的日期部分存储在不同的列中。