Limbajul SQL prezinta trei tipuri de operatii pentru manipularea datelor din tabele: inserare, modificare si stergere. Fiecarei operatii ii corespunde o instructiune SQL: INSERT, UPDATE si DELETE.
Instructiunea UPDATE permite actualizarea (modificarea) valorilor pentru inregistrarile unor tabele. Pentru instructiunea UPDATE pot fi utilizate urmatoarele doua sintaxe (prima sintaxa se utilizeaza pentru actualizarea inregistrarilor dintr-un singur tabel, iar cea de-a doua pentru actualizarea inregistrarilor din mai multe tabele).
UPDATE [LOW_PRIORITY] [IGNORE] nume_tabel SET nume_coloana1 = {expresie1|DEFAULT}[, nume_coloana2 = {expresie2|DEFAULT}] ... [WHERE conditie_actualizare] [ORDER BY {nume_coloana | expresie | pozitie_coloana} [ASC | DESC], ...] [LIMIT numar_inregistrari]
UPDATE [LOW_PRIORITY] [IGNORE] referinte_tabele SET nume_coloana1={expresie1|DEFAULT}[, nume_coloana2={expresie2|DEFAULT}] ... [WHERE conditie_actualizare]
Pentru a utiliza aceasta instructiune este necesar privilegiul UPDATE pentru coloanele referite (care urmeaza a fi modificate).
mysql> USE sakila Database changed mysql> DESCRIBE address; +-------------+----------------------+------+-----+-------------------+-----------------------------+ | Field | Type | Null | Key | Default | Extra | +-------------+----------------------+------+-----+-------------------+-----------------------------+ | address_id | smallint(5) unsigned | NO | PRI | NULL | auto_increment | | address | varchar(50) | NO | | NULL | | | address2 | varchar(50) | YES | | NULL | | | district | varchar(20) | NO | | NULL | | | city_id | smallint(5) unsigned | NO | MUL | NULL | | | postal_code | varchar(10) | YES | | NULL | | | phone | varchar(20) | NO | | NULL | | | last_update | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | +-------------+----------------------+------+-----+-------------------+-----------------------------+
Actualizarea inregistrarilor dintr-un tabel necesita cunoasterea structurii acestuia: lista coloanelor, domeniile de definitie ale coloanelor, optiunile stabilite la nivelul lor.
Avem in vedere actualizarea valorilor de la nivelul coloanei district, din tabelul address, cu valoarea Queensland pentru toate inregistrarile care detin valoarea QLD in coloana district.
mysql> UPDATE address -> SET district = 'Queensland' -> WHERE district = 'QLD'; Query OK, 2 rows affected
Clauzele corespunzatoare instructiunii UPDATE au urmatoarele semnificatii. Clauza LOW_PRIORITY se utilizeaza pentru a intarzia scrierea efectiva a datelor in tabel, pana cand utilizatorii nu mai citesc date din tabel. Are acelasi efect ca si in cazul instructiunii INSERT.
Daca este utilizata clauza IGNORE, instructiunea nu este intrerupta daca apar erori in timpul procesului de actualizare. Inregistrarile pentru care apar conflicte de duplicarea a cheii nu sunt actualizate.
Clauza SET permite specificarea coloanelor pentru care se realizeaza actualizarea, dar si specificarea valorilor corespunzatoare acestora. Orice valoare poate fi specificata prin intermediul unei expresii sau prin intermediul cuvantului cheie DEFAULT, caz in care coloana primeste valoarea implicita.
Clauza WHERE indica o conditie logica care stabileste inregistrarile care sunt actualizate. Daca aceasta clauza lipseste, vor fi actualizate toate inregistrarile din tabel. In exemplul urmator avem in vedere scrierea valorilor din coloana district cu majuscule prin utilizarea functiei UPPER() si neimplementarea unei conditii de actualizarea.
mysql> UPDATE address -> SET district = UPPER(district); Query OK, 600 rows affected
Daca este prezenta clauza ORDER, inregistrarile sunt actualizate in ordinea specificata. Clauza LIMIT stabileste o limita cu privire la numarul de inregistrari care pot fi actualizate.
Clauzele ORDER si LIMIT pot interveni intr-o implementare care necesita selectarea unei singure adrese in mod aleator – functia RAND() – pentru actualizarea coloanei address. Actualizarea presupune atasarea termenului favorite la adresa selectata.
mysql> UPDATE address -> SET address = CONCAT(address, ' - favorite') -> ORDER BY RAND() -> LIMIT 1; Query OK, 1 row affected
mysql> SELECT address_id, address, district, city_id, postal_code, phone -> FROM address -> WHERE address LIKE '%favorite'; +------------+--------------------------+----------+---------+-------------+--------------+ | address_id | address | district | city_id | postal_code | phone | +------------+--------------------------+----------+---------+-------------+--------------+ | 519 | 962 Tama Loop - favorite | | 583 | 65952 | 282667506728 | +------------+--------------------------+----------+---------+-------------+--------------+
Pentru a actualiza inregistrari in mai multe tabele este necesara cea de-a doua sintaxa, din cele precizate la inceputul materialului, caz in care nu pot fi utilizate clauzele ORDER BY si LIMIT. La reactivarea conturilor clientilor inactivi din tabelul customer marcam adresa acestora prin plasarea terminatiei test in coloana address, din tabelul address.
mysql> UPDATE customer c INNER JOIN address a ON c.address_id = a.address_id -> SET c.active = 1, a. address = CONCAT(address, ' - test') -> WHERE c.active = 0; Query OK, 30 rows affected