coluna de atualização do mysql com valor de outra tabela


221

Eu tenho duas mesas, ambas parecendo

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

Preciso copiar o valor de valuefrom tableApara com tableBbase no nome da verificação em cada tabela.

Alguma dica para esta UPDATEafirmação?

Respostas:


413

Além desta resposta, se você precisar alterar tableB.value de acordo com tableA.value dinamicamente, você pode fazer, por exemplo:

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'

Sim, INNER JOINé perfeito nesta situação. Eu também utilizado CONCAT_WSpara nomear merge pruduct e SKU de outra tabela
vladkras

2
Existe uma maneira de fazer isso usando aliases?
Gellie Ann

Eu tentei isso, mas sem sucesso, porque a contagem de "linhas afetadas" me dá 5690, mas o total de linhas é 59643, por quê? esta é a consulta: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
Grande Esfinge

Isso não funciona. A tabela B ainda possui seus próprios dados sem alterações. wtools.io/paste-code/bzWA Uma amostra baseada no OP e nesta resposta.
sniffingdoggo

157

você precisa juntar as duas tabelas:

por exemplo, você deseja copiar o valor da nametabelaA para tableBonde eles têm o mesmoID

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

ATUALIZAÇÃO 1

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

ATUALIZAÇÃO 2

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

1
ive mais de um registro de 1k com nomes e valores diferentes, aqui está o que você diz apenas para o 1º registro #
LeoSam

você pode simplesmente remover a wherecláusula ou modificar a wherecláusula dependendo de suas necessidades ..
John Woo

Também a tabela B obteve mais registros que a tabela A, minha ideia é verificar da tabela B para a se o nome existir, copiar o valor de "value" para a tabela B,!
31712 LeoSam

não sei se entendi sua pergunta claramente, você pode verificar minha resposta atualizada?
John Woo

Eu tentei tanto atualização, a segunda diz effeced em 734 linhas, eu verifiquei valores ainda todos 0 não mudou
LeoSam

91

A segunda possibilidade é,

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

7
Sim, não há necessidade de junções complicadas, quando tudo o que precisamos é atualizar um campo com um valor de outra tabela.
Davidkonrad

8
Sim, isso funciona bem, mas é muito, muito lento em grandes conjuntos de dados. Se você estiver trabalhando com tabelas pequenas, esse método é adequado, mas eu recomendo o JOIN como mostrado acima para qualquer outra coisa.
Frjj2k 04/12/2015

Além disso, nesse cenário, as tabelas A e B não podem ser a mesma tabela devido a restrições do SQL.
Muhwu 27/10

@ frijj2k isso ainda seria lento se .nameestiver indexado nas duas tabelas?
Steverino

3

A segunda opção também é viável se você estiver usando o modo de atualizações seguras (e estiver recebendo um erro indicando que tentou atualizar uma tabela sem um WHERE que usa uma coluna KEY), adicionando:

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

Armazene seus dados na tabela temporária

Select * into tempTable from table1

Agora atualize a coluna

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

0

No meu caso, a solução aceita era muito lenta. Para uma tabela com 180 mil linhas, a taxa de atualizações era de cerca de 10 linhas por segundo. Isso ocorre com os índices nos elementos de junção.

Finalmente resolvi meu problema usando um procedimento:

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

Espero que ajude alguém no futuro, como me ajudou


-4

Se você tem um campo comum em ambas as tabelas, é muito fácil! ....

Tabela-1 = tabela onde você deseja atualizar. Tabela-2 = tabela de onde você toma os dados.

  1. faça a consulta na Tabela 1 e encontre o valor do campo comum.
  2. faça um loop e encontre todos os dados da Tabela 2 de acordo com o valor da Tabela 1.
  3. faça novamente a consulta de atualização na tabela 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();
    }


}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.