在插入之前检查数据库中是否存在元组数据

时间:2015-04-16 10:16:53

标签: php mysql sql

我想在将数据输入数据库列之前检查元组数据是否存在。我正在尝试mysql_query并得到我应该使用mysqli的错误,但它似乎对我不起作用。

这是我目前的代码

foreach ($AllData as $sigleData) {
    $table = $sigleData['name'];
    $columns = implode(", ", $sigleData['columns']);
    $columnData = implode(" ',' ", $sigleData['data']);

    //insert into database tuple data       
    $sqlQuery = "INSERT INTO " . $table . " ( " . $columns . ") VALUES( '" . $columnData . "')";

    if ($dbConnectionT->query($sqlQuery) == TRUE) {
        echo "database updated";
        echo "</br>";
    }
}

我有这个功能: -

        function check_tuple_exists($table){
        global $dbConnectionT; // connection to database
        $sql = "SELECT ALL FROM '".$table."'";
        $res = $dbConnectionT->query($sql);
        if ($res->num_rows > 0) 
        {   // output data of each row
            while($row = $res->fetch_assoc()) {
            echo "data " . $columnData . "<br>";
            }
        } else 
                {
                    echo "0 results";
                }       

        }

但它给了我这个错误: - 试图获得非对象的属性

2 个答案:

答案 0 :(得分:1)

好吧,如果你这样做是因为你想更新/跳过插入你要插入的数据,你应该尝试使用INSERT REPLACEINSERT IGNORE查询,而不是提前检查。对您来说更容易,更清洁,更快速地应用。检查此问题以查看差异:

What is the performance difference between "insert ignore" and replace in MySQL?

基本上:

  • INSERT IGNORE跳过插入(如果存在)
  • INSERT REPLACE更改行(如果存在)

另外,这就是FYI,请注意您的代码中可能有SQL注入。检查PDO和准备好的语句以避免它们。

答案 1 :(得分:1)

更快更简单的方法(始终确保一致的数据库,独立于PHP)是在MySQL表上创建一个复合UNIQUE索引(参见MySQL docs,这也可以在phpMyAdmin中实现) 。此索引应包含此组合中必须唯一的所有列;在你的情况下,这将是所有列。

此索引可确保表中没有重复项。使用PHP插入新行时,只需使用语句INSERT IGNORE INTO ...(请参阅docs)。这将首先检查是否已存在具有相同内容的行。在这种情况下,语句将被忽略,否则将被创建。