如果记录已存在于我的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 );
答案 0 :(得分:1)
如果您的列SalesRecord
设置为唯一,那么您将收到插入错误。如果没有,请更改表格并使列唯一。然后只需使用以下语法:
$sql = "INSERT IGNORE INTO `ebaysaleslistings` ......";
请注意IGNORE
之后的INSERT
。这将使MySQL忽略任何错误。
请切换为PDO
或mysqli_*
方法。已弃用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;你离开了。