如果字段尚不存在,则插入Sql行

时间:2014-12-28 21:52:05

标签: php mysql sql

如果记录已存在于我的mysql数据库中,我希望不插入记录

我有一个将销售数据插入我的数据库的MySQL查询

我运行一个脚本,收集过去一天/或一周的所有销售额

但有时候我的查询会有相同/重复的销售信息,我不希望将该查询输入我的数据库,我只是想跳过它

每个销售记录的字段'SalesRecord'都是unquie,即7343,如果我的数据库中已存在销售记录,那么编写sql查询以跳过销售记录的最简单方法

继承我的sql

// NOW ADD THE SALES DATA TO EBAYSALESLISTINGS DATABASE
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
$sql = "INSERT INTO `ebaysaleslistings`(`SalesRecord`, `OrderID`, `Order`, `AmountPaid`, `SalesTaxAmount`, `ExternalTransactionID`, ".
   "`ExternalTransactionTime`, `ExternalFeeOrCreditAmount`, `ExternalTransactionPaymentOrRefundAmount`, `ShippingServiceSelected`, `ShippingServiceCost`, `ShippedTime`, ".
   "`Name`, `Street1`, `Street2`, `CityName`, `PostalCode`, `StateOrProvince`, `CountryName`, `Phone`, `OrderLineItemID`, `EbayItemID`, ".
   "`EbayFees`, `Title`, `QuantityPurchased`, `BuyerEmail`, `TransactionID`, `TransactionPrice`, `Platform`) ".

   "VALUES ('$elm_SaleRecordID','$elm_OrderID','$elm_OrderStatus','$AmountPaid','$SalesTaxAmount','$externalTransaction->ExternalTransactionID','$externalTransaction->ExternalTransactionTime','$externalTransaction->FeeOrCreditAmount','$externalTransaction->FeeOrCreditAmount', ".
   "'$ShippingServiceSelected->ShippingService','$ShippingServiceSelected->ShippingServiceCost','$order->ShippedTime','$shippingAddress->Name','$shippingAddress->Street1','$shippingAddress->Street2','$shippingAddress->CityName','$shippingAddress->PostalCode', ".
   "'$shippingAddress->StateOrProvince','$shippingAddress->CountryName','$shippingAddress->Phone','$transaction->OrderLineItemID','$elm_EbayItemID', ".
   "'$elm_EbayFees','$elm_title','$transaction->QuantityPurchased','$elm_email','$transaction->TransactionID','$transaction->TransactionPrice','$transaction->Platform')";

echo "<br><br>" . $sql . "<br><br>";

mysql_select_db('ebaylistingmanager');
$retval = mysql_query( $sql, $conn );

2 个答案:

答案 0 :(得分:1)

如果您的列SalesRecord设置为唯一,那么您将收到插入错误。如果没有,请更改表格并使列唯一。然后只需使用以下语法:

$sql = "INSERT IGNORE INTO `ebaysaleslistings` ......";

请注意IGNORE之后的INSERT。这将使MySQL忽略任何错误。

请切换为PDOmysqli_*方法。已弃用mysql_*个方法。

答案 1 :(得分:1)

我不会使用Insert ignore选项,因为这会忽略其他错误,

最有效的方法,假设当你说那个字段的唯一时,你的意思是数据库实际上有一个唯一的密钥设置正确使用PDO,并且只是忽略了重复键错误抛出的异常代码23000或者我必须查找它。

$PDO = new \PDO(
    "mysql:host=$dbHost;dbname=$dbName",
    $dbUser,
    $dbPass
);
//set pdo error mode to throw exceptions.  So we can in turn catch them :)
$this->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);

try{
   //obviously use your query here.
   $stmt = $PDO->prepare( '
      INSERT INTO
           table
      ( field1, field2 ) VALUES ( :value1, :value2 )
  ');
    $stmt->execute( array( ':value1'=>1, ':value2' => 2) );

}catch( PDOException $e ){
    if( $e->getCode() != 23000 ){
       //if not code 23000 die with error message output - 23000 is duplicate key
       die( "<pre>($e->getMessage()}\n\n{$e->getTraceAsString()}");
    }
}

这有点偏离我的头脑,但它应该指向正确的方向。当然,更好的解决方案是通过不插入重复的数据来避免所有问题。但是我需要更多细节来说明如何让重复数据真正解决问题。

进一步阅读

http://php.net/manual/en/book.pdo.php

http://php.net/manual/en/class.pdoexception.php

除了SQL注入预防之外,使用PDO的另一个好处是在循环中使用准备和执行。这不应该被低估,因为你比单独使用mysql更有效,更清洁地运行它多次。

      $stmt = $PDO->prepare( '
         INSERT INTO
           table
         ( field1, field2 ) VALUES ( :value1, :value2 )
     ');

      foreach( $inputs as $values ){
         try{
              $stmt->execute( $values );
         }catch( PDOException $e ){
              if( $e->getCode() != 23000 ){
              //if not code 23000 die with error message output - 23000 is duplicate key
                  die( "<pre>($e->getMessage()}\n\n{$e->getTraceAsString()}");
              }
          }
      }

这样,您就不会在输入的每个循环上重新生成查询。但是,您希望try catch块只是在查询的实际执行周围,或者它将会“开始”#34;你离开了。