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


Sql insert row if a field does not already exist

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

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

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

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

字段"SalesRecord"对于每个销售记录(即 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 );

我不将使用插入忽略选项,因为这会忽略其他错误,

最有效的

方法,假设当你说该字段的唯一时,你的意思是数据库实际上有一个独特的键设置正确是使用 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块恰好在查询的实际执行附近,否则它会将您"踢"出循环。

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

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

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

并请切换到PDOmysqli_*方法。 mysql_*方法已被弃用。