Как обновить таблицу в базе данных с помощью SQL?sql-14

Основной синтаксис UPDATE

Команда UPDATE используется для изменения существующих данных в таблице:

UPDATE table_name
SET column1 = value1,
    column2 = value2, ...
[WHERE condition];

Простой пример:

UPDATE employees
SET salary = 50000,
    department = 'IT'
WHERE employee_id = 101;

Ключевые аспекты обновления данных

1. Обновление одного столбца

UPDATE products
SET price = 29.99
WHERE product_id = 1001;

2. Обновление нескольких столбцов

UPDATE customers
SET first_name = 'John',
    last_name = 'Smith',
    email = 'john.smith@example.com'
WHERE customer_id = 42;

3. Обновление с вычисляемыми значениями

UPDATE orders
SET total_amount = quantity * unit_price * (1 - discount)
WHERE order_id = 12345;

4. Обновление с подзапросом

UPDATE employees
SET salary = salary * 1.1
WHERE department_id IN (
    SELECT department_id
    FROM departments
    WHERE location = 'New York'
);

Безопасное обновление данных

1. Всегда используйте WHERE

-- ОПАСНО: обновит все строки в таблице!
UPDATE products SET discontinued = 1;

-- Безопасный вариант
UPDATE products SET discontinued = 1
WHERE product_id = 1001;

2. Проверка перед обновлением

-- Сначала посмотреть, что будет обновлено
SELECT * FROM employees
WHERE salary < 30000;

-- Затем выполнить обновление
UPDATE employees
SET salary = salary * 1.15
WHERE salary < 30000;

3. Использование транзакций

BEGIN TRANSACTION;

UPDATE accounts
SET balance = balance - 100
WHERE account_id = 1;

UPDATE accounts
SET balance = balance + 100
WHERE account_id = 2;

-- Проверить изменения перед коммитом
-- ROLLBACK; -- если что-то не так
COMMIT;

Продвинутые техники обновления

1. Обновление с JOIN

UPDATE p
SET p.price = p.price * 1.1
FROM products p
JOIN product_categories pc ON p.category_id = pc.category_id
WHERE pc.category_name = 'Electronics';

2. Обновление с использованием CTE

WITH top_products AS (
    SELECT product_id
    FROM sales
    GROUP BY product_id
    ORDER BY SUM(quantity) DESC
    LIMIT 10
)
UPDATE products
SET featured = 1
WHERE product_id IN (SELECT product_id FROM top_products);

3. Массовое обновление с ограничением

-- Обновить 100 записей за раз (SQL Server)
UPDATE TOP (100) customers
SET last_contact_date = GETDATE()
WHERE last_contact_date IS NULL;

4. Обновление с возвратом измененных данных

UPDATE employees
SET vacation_days = vacation_days + 5
OUTPUT
    inserted.employee_id,
    deleted.vacation_days AS old_value,
    inserted.vacation_days AS new_value
WHERE hire_date < '2020-01-01';

Особенности в разных СУБД

MySQL/MariaDB

UPDATE employees e, departments d
SET e.salary = e.salary * 1.1
WHERE e.department_id = d.department_id
AND d.location = 'London';

PostgreSQL

UPDATE employees
SET salary = salary * 1.1
FROM departments
WHERE employees.department_id = departments.department_id
AND departments.location = 'London';

Oracle

UPDATE
    (SELECT e.salary, d.location
     FROM employees e
     JOIN departments d ON e.department_id = d.department_id
     WHERE d.location = 'London')
SET salary = salary * 1.1;

Резюмируем

Ключевые моменты обновления таблиц в SQL:

  1. Используйте UPDATE table SET column = value WHERE condition для базового обновления
  2. Всегда проверяйте условие WHERE, чтобы избежать массового обновления
  3. Для сложных обновлений используйте JOIN, подзапросы или CTE
  4. Применяйте транзакции для критических изменений
  5. В разных СУБД синтаксис может отличаться (особенно для JOIN в UPDATE)
  6. Используйте OUTPUT/RETURNING для получения информации об измененных строках

Безопасный шаблон для важных обновлений:

BEGIN TRANSACTION;

-- Сначала проверить, какие строки будут затронуты
SELECT * FROM table WHERE condition;

-- Затем выполнить обновление
UPDATE table SET column = value WHERE condition;

-- Проверить результат
SELECT * FROM table WHERE condition;

-- COMMIT или ROLLBACK в зависимости от результата
COMMIT TRANSACTION;

Помните, что обновление данных - это операция, изменяющая состояние базы данных, поэтому важно:

  • Делать бэкапы перед массовыми обновлениями
  • Тестировать запросы на тестовой среде
  • Использовать транзакции для атомарности изменений