web-dev-qa-db-ja.com

別のテーブルからの値でmysql更新列

2つのテーブルがあり、どちらも

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

各テーブルのチェック名に基づいて、valueの値をtableAからtableBにコピーする必要があります。

このUPDATEステートメントに関するヒントはありますか?

183
LeoSam

この答えに加えて、動的にtableA.valueに従ってtable.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'
346
RafaSashi

2つのテーブルを結合する必要があります。

たとえば、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'

UPDATE 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
140
John Woo

2番目の可能性は

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

2番目のオプションは、セーフ更新モードを使用している場合(そして、KEY列を使用するWHEREなしでテーブルを更新しようとしたことを示すエラーが出た場合)にも実行可能です。

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

データを一時テーブルに保存する

Select * into tempTable from table1

今すぐ列を更新します

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

私の場合、受け入れられている解決策は遅すぎました。 180K行のテーブルの場合、更新速度は毎秒約10行でした。これはjoin要素のインデックスと一緒です。

私はついに手順を用いて私の問題を解決しました:

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