2012-06-20 2 views
0

예를 들어 회사 이름, 제품 및 가격이 포함 된 텍스트 파일이 있습니다. db에는 약 200 개의 레코드가 있고 텍스트 파일에는 더 적은 레코드가 있습니다. 이제 한 SQL 쿼리로 모든 가격을 db로 업데이트하고 싶습니다. 나는 이것을 시도 :PHP를 사용하여 MySQL에서 여러 행을 동시에 업데이트

for($i = $start_row; $i < $stop_row; $i += 3) 
... 
$prices = array($price1, $price2, price3); 
$pricesfloat = array_map('floatval', $prices); 
... 
$query = "UPDATE test3 SET price1 = $pricesfloat[0], price2 = $pricesfloat[1], price3 = $pricesfloat[2] WHERE company = '$company' AND product = '$product'"; 
mysql_query($query, $connection) or die(mysql_error()); 

mysql_affected_rows() 0을 반환 행. INSERT INTO를 사용하여 db에 모든 값을 삽입 할 수 있지만이 경우 기존 값을 업데이트하고 나중에 누락 된 값을 추가해야합니다. 누군가 도움을 줄 수 있습니까? :)

+0

참고. 이전 값과 새 값이 같은 경우입니다. –

+0

아마도 REPLACE sql-query가 도움이 될까요? – odiszapc

+0

기억이 나면'REPLACE' 문이'어디서나 '를 지원하지 않습니다 – user1108483

답변

0

INSERT ... ON DUPLICATE KEY UPDATE, http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html, 당신에게 상황에 맞게 수

INSERT INTO table (product_id, price) VALUES (1, 1.323),(2, 3434) ... (200, 2.333) ON DUPLICATE KEY UPDATE price = VALUES(price) 

대량 업데이트의 또 다른 방법은 다음과 같습니다 업데이트가 성공하더라도 있으며, mysql_affected_rows는 0을 돌려주는 일이 있습니다

UPDATE table 
INNER JOIN (
    (SELECT 'company1' AS company, 'product1' AS product, 'price1' AS price 
    UNION ALL SELECT 'company2', 'product2', 'price2' 
    .... 
    UNION ALL SELECT 'companyN', 'productN', 'priceN') AS tmp 
) USING (company, product) 
SET table.price = tmp.price 
+0

그 이유는 무엇입니까? 데이터베이스에는 제품 및 회사에 대한 ID가 없으므로 각 행에 대한 ID 만 있습니다. 그리고 계획은 일치하는 행은 업데이트가 있어야하고 추가 된 데이터가 없으면 php 스크립트는 일치하는 항목이없는 경우 사용자에게 수행 할 작업을 묻습니다. – user1108483

+0

(회사, 제품)에 고유 인덱스를 추가하여 중복 충돌이 발생할 수 있습니다. 또는 유니온 생성 파생 테이블로 까다로운 업데이트를 사용하십시오. – vearutop

+0

회사에 고유 인덱스를 추가하려고했지만 '중복 항목 오류'라는 메시지가 나타납니다. 기록 ID로 뭔가해야합니까? 물론 기본 키입니다 ... – user1108483

관련 문제