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


221

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

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

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

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

Ответы:


414

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

да, INNER JOINидеально подходит в этой ситуации. Я также использовал CONCAT_WSдля слияния названия
продукта

2
Есть ли способ сделать это с помощью псевдонимов?
Гелли Энн

Я попробовал это, но безуспешно, потому что количество «затронутых рядов» дает мне 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
Великий Сфинкс

Это не работает ТаблицаB по-прежнему имеет свои собственные данные без изменения. wtools.io/paste-code/bzWA Пример, основанный на OP и этом ответе.
sniffingdoggo

157

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

например, вы хотите скопировать значение nameиз таблицы A туда, 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
у меня более 1 тыс. записей с разными именами и значениями, вот ваше высказывание только для 1-й записи
LeoSam

Вы можете просто удалить whereпредложение или изменить его в whereзависимости от ваших потребностей ..
Джон Ву

также таблица B получила больше записей, чем таблица A, моя идея заключается в проверке из таблицы B в a, если имя существует, скопируйте значение «value» в таблицу B,!
LeoSam

я не знаю, правильно ли я понял ваш вопрос, вы можете проверить мой обновленный ответ?
Джон Ву

я попробовал оба обновления, второй говорит, что действует на 734 строки, я проверил значения все еще 0 не изменилось
LeoSam

91

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

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

7
Да, нет необходимости в сложных объединениях, когда все, что нам нужно, это обновить поле значением из другой таблицы.
Давидконрад

8
Да, это прекрасно работает, но очень и очень медленно на больших наборах данных. Если вы работаете с небольшими таблицами, этот метод подойдет, но я рекомендую JOIN, как показано выше, для всего остального.
frijj2k

Кроме того, в этом случае таблицы A и B не могут быть одной и той же таблицей из-за ограничений SQL.
Muhwu

@ frijj2k будет ли это все еще медленным, если .nameпроиндексировано в обеих таблицах?
Steverino

3

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

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


1

Сохраните ваши данные во временной таблице

Select * into tempTable from table1

Теперь обновите столбец

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

0

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

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


-4

Если у вас есть общее поле в обеих таблицах, тогда это так просто! ....

Таблица-1 = таблица, где вы хотите обновить. Таблица-2 = таблица, откуда вы берете данные.

  1. сделать запрос в таблице 1 и найти значение общего поля.
  2. сделать цикл и найти все данные из таблицы 2 в соответствии со значением таблицы 1.
  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();
    }


}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.