다른 테이블의 값이있는 mysql 업데이트 열


221

나는 두 개의 테이블이 있습니다.

id  name  value
===================
1   Joe     22
2   Derk    30

각 테이블의 확인 이름 을 기준으로 valuefrom에서 tableAto 값을 복사해야 tableB합니다.

UPDATE진술에 대한 팁이 있습니까?

답변:


412

이 답변 외에도 tableA.value에 따라 tableB.value를 동적으로 변경 해야하는 경우 다음과 같이 할 수 있습니다.

UPDATE tableB
INNER JOIN tableA ON tableB.name = tableA.name
SET tableB.value = IF(tableA.value > 0, tableA.value, tableB.value)
WHERE tableA.name = 'Joe'

그래, INNER JOIN이 상황에서 최적입니다. 나는 또한 CONCAT_WS다른 테이블에서 pruduct 이름과 SKU를 병합 하는 데 사용 되었습니다
vladkras

2
별명을 사용하여이를 수행하는 방법이 있습니까?
Gellie Ann

"영향을받는 행"수가 5690을 제공하기 때문에 이것을 시도했지만 성공하지 못했습니다. 총 행이 59643입니다. 왜 그렇습니까? 이것은 쿼리입니다 :UPDATE participants_registrations INNER JOIN participants ON participants.id = participants_registrations.participantId INNER JOIN registrations ON registrations.id = participants_registrations.registrationId LEFT JOIN groups ON (groups.id = registrations.groupId) SET registrations.groupId = groups.id, registrations.groupName = groups.name, participants.memberOfGroupName = groups.name
위대한 스핑크스

작동하지 않습니다. tableB에는 여전히 변경하지 않고 자체 데이터가 있습니다. wtools.io/paste-code/bzWA OP 및이 답변에 기반한 샘플.
스니핑 독고

157

두 테이블을 결합해야합니다.

예를 들어 nametableA 의 값을 tableB동일한 위치 로 복사하려고합니다.ID

UPDATE tableB t1 
        INNER JOIN tableA t2 
             ON t1.id = t2.id
SET t1.name = t2.name 
WHERE t2.name = 'Joe'

업데이트 1

UPDATE tableB t1 
        INNER JOIN tableA t2 
             ON t1.id = t2.id
SET t1.name = t2.name 

업데이트 2

UPDATE tableB t1 
        INNER JOIN tableA t2 
             ON t1.name = t2.name
SET t1.value = t2.value

1
이름과 가치가 다른 1k 이상의 레코드를 기록하십시오. 여기에서 첫 번째 레코드에 대한 귀하의
의견

당신은 where절을 제거 하거나 where필요에 따라 절을 수정할 수 있습니다 .
John Woo

또한 테이블 B는 테이블 A보다 많은 레코드를 얻었습니다. 제 생각은 이름이 존재하는 경우 테이블 B에서 a로 확인하고 "value"값을 테이블 B에 복사하십시오!
LeoSam

질문을 명확하게 이해했는지 모르겠습니다. 업데이트 된 답변을 확인할 수 있습니까?
John Woo

나는 두 가지 업데이트를 모두 시도했지만 두 번째는 734 행에 effeced라고 말했지만 여전히 값을 모두 0으로 변경하지 않았 음을 확인했습니다.
LeoSam

91

두 번째 가능성은

UPDATE TableB 
SET TableB.value = (
    SELECT TableA.value 
    FROM TableA
    WHERE TableA.name = TableB.name
);

7
예, 복잡한 조인이 필요하지 않습니다. 필요한 경우 다른 테이블의 값으로 필드를 업데이트하면됩니다.
davidkonrad

8
예, 이것은 잘 작동하지만 큰 데이터 세트에서는 매우 느립니다. 작은 테이블로 작업하는 경우이 방법은 좋지만 위에 표시된 것처럼 다른 방법으로 JOIN을 권장합니다.
frijj2k

또한이 시나리오에서 테이블 A와 B는 SQL 제한 조건으로 인해 같은 테이블 일 수 없습니다.
Muhwu

@ frijj2k .name두 테이블 모두에서 색인이 생성 되면 여전히 느릴 까요?
Steverino

3

안전 업데이트 모드를 사용하고 (KEY 열을 사용하는 WHERE없이 테이블을 업데이트하려고했음을 나타내는 오류가 발생하는 경우) 두 번째 옵션은 다음을 추가하여 실행할 수도 있습니다.

UPDATE TableB  
SET TableB.value = (  
SELECT TableA.value  
    FROM TableA  
    WHERE TableA.name = TableB.name  
)  
**where TableB.id < X**  
;

2
    UPDATE    cities c,
          city_langs cl
    SET       c.fakename = cl.name
   WHERE     c.id = cl.city_id

1

임시 테이블에 데이터 저장

Select * into tempTable from table1

이제 열을 업데이트하십시오.

 UPDATE table1
    SET table1.FileName = (select FileName from tempTable where tempTable.id = table1.ID);

0

필자의 경우 허용 된 솔루션이 너무 느 렸습니다. 180K 개의 행이있는 테이블의 경우 업데이트 속도는 초당 약 10 행입니다. 이것은 조인 요소의 인덱스와 함께 있습니다.

마침내 절차를 사용하여 문제를 해결했습니다.

CREATE DEFINER=`my_procedure`@`%` PROCEDURE `rescue`()
BEGIN
    declare str VARCHAR(255) default '';
    DECLARE n INT DEFAULT 0;
    DECLARE i INT DEFAULT 0;
    DECLARE cur_name VARCHAR(45) DEFAULT '';
    DECLARE cur_value VARCHAR(10000) DEFAULT '';
    SELECT COUNT(*) FROM tableA INTO n;
    SET i=0;
    WHILE i<n DO 
      SELECT namea,valuea FROM tableA limit i,1 INTO cur_name,cur_value;
      UPDATE tableB SET nameb=cur_name where valueb=cur_value;
      SET i = i + 1;
    END WHILE;

END

나는 그것이 나를 돕는 것처럼 미래에 누군가를 도울 수 있기를 바랍니다.


-4

두 테이블에 공통 필드가 있으면 너무 쉽습니다! ....

Table-1 = 업데이트하려는 테이블입니다. Table-2 = 데이터를 가져 오는 테이블.

  1. 표 1에서 쿼리하고 공통 필드 값을 찾으십시오.
  2. 루프를 만들고 표 1 값에 따라 표 2에서 모든 데이터를 찾으십시오.
  3. 다시 표 1에 업데이트 쿼리를 작성하십시오.

$qry_asseet_list = mysql_query("SELECT 'primary key field' FROM `table-1`");

$resultArray = array();
while ($row = mysql_fetch_array($qry_asseet_list)) {
$resultArray[] = $row;
}



foreach($resultArray as $rec) {

    $a = $rec['primary key field'];

    $cuttable_qry = mysql_query("SELECT * FROM `Table-2` WHERE `key field name` = $a");

    $cuttable = mysql_fetch_assoc($cuttable_qry);



    echo $x= $cuttable['Table-2 field']; echo " ! ";
    echo $y= $cuttable['Table-2 field'];echo " ! ";
    echo $z= $cuttable['Table-2 field'];echo " ! ";


    $k = mysql_query("UPDATE `Table-1` SET `summary_style` = '$x', `summary_color` = '$y', `summary_customer` = '$z' WHERE `summary_laysheet_number` = $a;");

    if ($k) {
        echo "done";
    } else {
        echo mysql_error();
    }


}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.