Escriptures a la Base de Dades - UPDATE
UPDATE amb els noms de les columnes
La comanda UPDATE s'utilitza per modificar les files existents en una taula.
La comanda necessita quatre paràmetres:
-
el nom de la taula,
-
els noms de les columnes de la taula que volem modificar,
-
un nou valor per cadascuna de les columnes que estem modificant,
-
una condició que identifiqui les files de la taula que volem modificar.
El nou valor pot ser el resultat d’una subconsulta d’una sola fila.
Modifiquem una columna
Amb un exemple modificarem el número de telèfon d’un empleat de la taula copy_employees.
UPDATE copy_employees
SET phone_number = '123456'
WHERE employee_id = 303;
| EMPLOYEE_ID | FIRST_NAME | LAST_NAME | PHONE_NUMBER |
|---|---|---|---|
| 303 | Angelina | Wright | 123456 |
Modifiquem vàries columnes
Amb una sola comanda podem canviar el valor de més d’una columna i també de vàries files a la vegada.
UPDATE copy_employees
SET phone_number='654321',
last_name = 'Jones'
WHERE employee_id >= 303;
| EMPLOYEE_ID | FIRST_NAME | LAST_NAME | PHONE_NUMBER |
|---|---|---|---|
| 303 | Angelina | Jones | 654321 |
| 304 | Test | Jones | 654321 |
Compte a l’actualitzar els valors d’una columna, Si oblidem la clàusula WHERE, s’actualitzaran totes les files de la taula.
UPDATE copy_employees
SET phone_number='654321',
last_name = 'Jones';
+-------------+------------+-----------+--------------+
| employee_id | first_name | last_name | phone_number |
+-------------+------------+-----------+--------------+
| 100 | Steven | Jones | 654321 |
| 101 | Neena | Jones | 654321 |
| 102 | Lex | Jones | 654321 |
| 103 | Alexander | Jones | 654321 |
| 104 | Bruce | Jones | 654321 |
| 107 | Diana | Jones | 654321 |
| 124 | Kevin | Jones | 654321 |
| ... | ... | ... | ... |
+-------------+------------+-----------+--------------+
UPDATE amb Subconsulta
Podem utilitzar el resultat d’una subconsulta d’una sola fila per a proporcionar el nou valor a una columna actualitzada.
UPDATE copy_employees
SET salary = (SELECT salary
FROM copy_employees
WHERE employee_id = 100)
WHERE employee_id = 101;
Assignem a l’empleat 101 el mateix sou que l’empleat 100
+-------------+------------+-----------+--------+
| employee_id | first_name | last_name | salary |
+-------------+------------+-----------+--------+
| 100 | Steven | King | 24000 |
| 101 | Neena | Kochhar | 24000 |
+-------------+------------+-----------+--------+
Per actualitzar vàries columnes en una sola sentència UPDATE, podem escriure unes quantes subconsultes d'una sola fila, una per a cada columna:
UPDATE copy_employees SET
salary = (SELECT salary FROM copy_employees
WHERE employee_id = 205),
job_id = (SELECT job_id FROM copy_employees
WHERE employee_id = 205)
WHERE employee_id = 206;
Hi ha forma d'utilitzar la mateixa subconsulta per actualitzar diversos camps?
En MariaDB i MySQL la resposta és NO. En Oracle podriem utilitzar la següent comanda sense error:
UPDATE copy_employees SET
(salary, job_id) = (SELECT salary, job_id FROM copy_employees
WHERE employee_id = 205)
WHERE employee_id = 206;
+-------------+------------+-----------+--------+--------+
| employee_id | first_name | last_name | salary | job_id |
+-------------+------------+-----------+--------+--------+
| 205 | Shelley | Higgins | 12000 | AC_MGR |
| 206 | Neena | Kochhar | 12000 | AC_MGR |
+-------------+------------+-----------+--------+--------+
UPDATE a partir d'altres taules
-
La subconsulta sempre pot fer-se sobre alguna altra taula.
-
La subconsulta pot ser que sigui independent de la fila que estem actualitzant o bé
-
La subconsulta pot estar correlacionada amb les dades de la fila que estiguem actualitzant en la sentència
UPDATE copy_employees ce SET
manager_id = (SELECT manager_id
FROM copy_departments
WHERE department_id = ce.department_id);