Records bijwerken (MySQL)

Uit De Vliegende Brigade
Naar navigatie springen Naar zoeken springen

Als het gaat om het updaten van bestaande records, krijg je al snel te maken met het commando UPDATE. Maar er zijn meer mogelijkheden:

Als er een relatie is tussen de tabellen

update 
   tbl_powertools03
join 
   tbl_powertools01 
   on 
   tbl_powertools03.merk = tbl_powertools01.brand_uppercase
set 
   tbl_powertools03.merk = tbl_powertools01.brand_normalcase

Zonder relatie

Hier wordt een tabel gevuld aan de hand van een andere tabel, zonder join. Additioneel voordeel: Je hoeft geen velden te benoemen die leeg blijven in de doel-tabel:

UPDATE table1
SET column1 = (SELECT expression1
               FROM table2
               WHERE conditions)
WHERE conditions;

Van Select- naar Update-query

Dit is een situatie die ik regelmatig tegenkom: Ik heb de juiste data boven water getoverd met behulp van een select-query (in dit geval met een dubbele join), maar hoe maak ik daar nu een update-query van?

Voorbeeld

# Select query
##############
#
select 
   node.title
from 
   node
join 
   uc_products 
   on 
      node.nid = uc_products.nid
join 
   uc_product_beterenamen 
   on 
      uc_products.model = uc_product_beterenamen.sku;

# Update query
##############
#
update 
   node
join
   uc_products 
   on 
      node.nid = uc_products.nid
join
   uc_product_beterenamen 
   on 
      uc_products.model = uc_product_beterenamen.sku
set 
   node.title = uc_product_beterenamen.title;

Meerdere velden & meerdere records tegelijkertijd

Meerdere records bijwerken ahv. een identiek criterium

Da's nou precies waar SQL voor bedoeld is: Bewerkingen uitvoeren op datasets. Bv.:

update tbl_main set merk ="AFP" where productnaam like "%AFP%" and merk is null;

Meerdere records bijwerken ahv. verschillende criteria

Regelmatig kom ik situaties tegen met een lange reeks update-statements. Bv.:

update tbl_main set merk ="AFP" where productnaam like "%AFP%" and merk is null;
update tbl_main set merk ="Aer" where productnaam like "%Aer%" and merk is null;
update tbl_main set merk ="Ace" where productnaam like "%Ace%" and merk is null;
update tbl_main set merk ="Agi" where productnaam like "%Agi%" and merk is null;
update tbl_main set merk ="All" where productnaam like "%All%" and merk is null;
update tbl_main set merk ="Ani" where productnaam like "%Ani%" and merk is null;
update tbl_main set merk ="Bar" where productnaam like "%Bar%" and merk is null;
update tbl_main set merk ="Bes" where productnaam like "%Bes%" and merk is null;
update tbl_main set merk ="Bet" where productnaam like "%Bet%" and merk is null;
update tbl_main set merk ="Bit" where productnaam like "%Bit%" and merk is null;
update tbl_main set merk ="Bob" where productnaam like "%Bob%" and merk is null;
update tbl_main set merk ="Bon" where productnaam like "%Bon%" and merk is null;
update tbl_main set merk ="Can" where productnaam like "%Can%" and merk is null;
update tbl_main set merk ="Chu" where productnaam like "%Chu%" and merk is null;
update tbl_main set merk ="Dem" where productnaam like "%Dem%" and merk is null;
update tbl_main set merk ="Den" where productnaam like "%Den%" and merk is null;
update tbl_main set merk ="Dur" where productnaam like "%Dur%" and merk is null;
update tbl_main set merk ="Hun" where productnaam like "%Hun%" and merk is null;
update tbl_main set merk ="Dog" where productnaam like "%Dog%" and merk is null;
update tbl_main set merk ="Equ" where productnaam like "%Equ%" and merk is null;

Dan voel ik me altijd een beetje dom, maar veel efficiënter kan het volgens mij niet, omdat er voor elke set een ander criterium geldt.

Meerdere velden in één keer bijwerken ahv. identiek criterium

en een enkele keer kom ik een situatie tegen waarin ik per record graag alle kolommen wil bijwerken. Bv. om NULL-waardes om te fietsen naar lege velden voorafgaand aan een export naar een bestand. En weer is dat bij uitstek waar SQL goed in is. Bv.:

update tbl_main 
set 
   merk="AFP", 
   land="NL",
   beschikbaar="Ja"
where productnaam like "%AFP%" and merk is null;

Soms wil dat extreme vormen aannemen, zoals besproken in artikel Lege velden vervangen in alle tabellen (MySQL).

Update bij row number

Records in een tabel hebben geen gedefineerd rijnummer. Dat maakt het tricky om een bepaalde rij te updaten, maar niet onmogelijk. Bv.:

/*test data*/
create table foo (id int auto_increment primary key, a int);
insert into foo (a) values (10), (11), (12);

/*update statement*/
update foo
set a = 5
where id = (
   select id from (
      select id, @rownum:=@rownum + 1 as rownumber 
      from foo, (select @rownum:=0) vars order by id
   ) sq where rownumber = 2
);

Zie ook

Bronnen