2013-05-04 29 views
-1

我有一个主键“ID”和由price_date,fund_id,currency_id的唯一约束的数据库,类标识码插入对重复键更新 - 在mysqli的循环

$query = "INSERT INTO `price_data` (`price_date`, `fund_id`, `currency_id`, `class_id`, `nav`, `nav_change`) VALUES"; 


$format = " ('%s', '%s', '%s', '%s', %f, %f),"; 

// Go over each array item and append it to the SQL query 
foreach($prices as $price) { 
    $query .= sprintf(
     $format, 
     $mysqli->escape_string($price['PriceDate']), 
     $mysqli->escape_string($price['Fund']), 
     $mysqli->escape_string($price['Currency']), 
     $mysqli->escape_string($price['Class']), 
     $mysqli->escape_string($price['NAV']), 
     $mysqli->escape_string($price['NavChange']) 
    ); 
} 
// The last VALUES tuple has a trailing comma which will cause 
// problems, so let us remove it 
$query = rtrim($query, ','); 

// MySQLi::query returns boolean for INSERT 
$result = $mysqli->query($query); 

我想改变查询像

INSERT INTO `price_data`(price_date , fund_id , currency_id , nav , nav_change) VALUES() ON DUPLICATE KEY UPDATE nav='',nav_change=''; 

我试图把这段最初的查询是没有得到的导航和nav_chnge到查询的值。

$query .= ' ON DUPLICATE KEY UPDATE nav=$format$mysqli->real_escape_string($data[\'NAV\']),nav_change=$format,$mysqli->real_escape_string($data[\'NavChange\'])'; 

如果我回应结果查询,它看起来像下面

INSERT INTO `price_data` (`price_date`, `fund_id` , `currency_id`, `class_id`, `nav`, `nav_change`) VALUES ('2013-04-29', 'AAAA', '0', 'A', 11.793300, 0.054000), ON DUPLICATE KEY UPDATE nav=$format$mysqli->real_escape_string($data["NAV"]),nav_change=$format,$mysqli->real_escape_string($data["NavChange"]) 

感谢您的帮助。

回答

0

可能有更干净的方法来做到这一点,但在循环内附加到这样的查询为我工作。

$format = " ('%s', '%s', '%s', '%s', '%s', %f, %f)"; 
$format_update_nav = " '%f' , "; 
$format_update_nav_change = " '%f' ; ";  


$query = "INSERT INTO `aprice_data` (`price_date`, `fund_id`, `manager_id` , `currency_id`, `class_id`, `nav`, `nav_change`) VALUES "; 

        $query .= sprintf(
         $format, 
         $mysqli->real_escape_string($data['Date']), 
         $mysqli->real_escape_string($data['Fund']), 
         $mysqli->real_escape_string($data['Manager']),  
         $mysqli->real_escape_string($data['Currency']), 
         $mysqli->real_escape_string($data['Class']), 
         $mysqli->real_escape_string($data['NAV']), 
         $mysqli->real_escape_string($data['NavChange']) 
        ); 

        $query .= ' ON DUPLICATE KEY UPDATE nav = '; 
        $query .= sprintf(
         $format_update_nav, 
         $mysqli->real_escape_string($data['NAV'])      
        ); 

        $query .= 'nav_change = '; 
        $query .= sprintf(
         $format_update_nav_change, 
         $mysqli->real_escape_string($data['NavChange'])     
        ); 


    $result = $mysqli->query($query); 

这回看起来像这样

INSERT INTO `price_data` (`price_date`, `fund_id`, `manager_id` , `currency_id`, `class_id`, `nav`, `nav_change`) VALUES ('2013-05-03', 'WXYA', '17', '0', 'A', 456456.000000, 456456.000000) ON DUPLICATE KEY UPDATE nav = '456456.000000' , nav_change = '456456.000000' ; 
INSERT INTO `price_data` (`price_date`, `fund_id`, `manager_id` , `currency_id`, `class_id`, `nav`, `nav_change`) VALUES ('2013-05-03', 'BXYA', '17', '0', 'A', 0.130000, 0.000000) ON DUPLICATE KEY UPDATE nav = '0.130000' , nav_change = '0.000000' ; . . . 
查询