it-swarm.com.ru

mySQL обновить столбец со значением из другой таблицы

У меня есть две таблицы, оба выглядят как

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

Мне нужно скопировать значение value из tableA в tableB на основе имени проверки в каждой таблице.

Любые советы для этого заявления UPDATE?

173
LeoSam

В дополнение к этому ответу, если вам нужно динамически изменить tableB.value в соответствии с tableA.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'
324
RafaSashi

вам нужно объединить две таблицы: 

например, вы хотите скопировать значение name из tableA в 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
136
John Woo

Вторая возможность

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

Второй вариант возможен также, если вы используете безопасный режим обновлений (и вы получаете сообщение об ошибке, указывающее, что вы пытались обновить таблицу без WHERE, использующего столбец KEY), добавив: 

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

- Сохраните ваши данные во временной таблице Выберите * в tempTable из таблицы 1

- Теперь обновите столбец ОБНОВЛЕНИЕ table1 SET table1.FileName = (выберите FileName из tempTable, где tempTable.id = table1.ID);

0
Abid Mahmood

В моем случае принятое решение было слишком медленным. Для таблицы со 180К строк скорость обновления составляла около 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

Я надеюсь, что это поможет кому-то в будущем, как это помогло мне

0
justadev