Salta el contingut

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:

En ORACLE sí funciona en MariaDB i MySQL NO
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);