Базовый курс SQL. Обновление и удаление данных UPDATE DELETE

Forums:

[к оглавлению]

Обновление

Оператор UPDATE предназначен для изменения одной, нескольких или всех строк таблицы. Запрос содержит в себе:

  • имя изменяемой таблицы
  • имена столбцов и присваиваемые новые значения
  • условия, указывающие на строки, подлежащие обновлению

Опасность потери данных

При обновлении строк особенно внимательно следите за корректностью условий WHERE, т.к. ошибка может привести к затиранию лишних данных. По той же причине для операций обновления и удаления в СУБД могут потребоваться дополнительные права доступа. Убедитесь, что они у вас есть.

Рассмотрим пример. Предположим, студентка с student_id = 92518 сменила фамилию на 'Петрова'. Обновим данные в таблице Students:

UPDATE Students
SET student_surname = 'Петрова'
WHERE student_id = 92518;

Новое значение поля student_surname указывается после равно в рамках оператора SET. Для того, чтобы изменить несколько полей, укажите через запятую все поля вместе с их новыми значениями:

UPDATE Students
SET student_surname = 'Петрова', student_email = NULL
WHERE student_id = 92518;

В данном случае, будут обновлены 2 столбца в строке со student_id = 92518.

NULL

На этом примере видно, что при обновлении мы можем не только изменить данные, но и удалить старое значение, записав в поле NULL. Конечно, мы можем это сделать только в том случае, если условия, установленные при создании таблицы, допускают оставлять выбранное поле пустым. Используя в запросах NULL, полезно знать, чем он отличается от пустой строки (записывается как ''): NULL буквально означает отсутствие значения, в то время как пустая строка является значением, хотя и пустым. Не используйте '' для удаления данных - это может привести к ошибкам.

Обновление данными из другой таблицы. FROM

Некоторые СУБД позволяют провести UPDATE всей таблицы, используя данные другой таблицы. Это делается с помощью оператора FROM (см. аналогичный пример записи строк из другой таблицы). Для уточнения синтаксиса обратитесь к документации вашей СУБД.

Также UPDATE может включать в себя подзапрос SELECT: для обновления конкретного столбца данными из другой таблицы.

Удаление

Оператор DELETE предназначен для удаления одной, нескольких или всех строк таблицы.

Опасность потери данных

При удалении строк особенно внимательно следите за корректностью условий WHERE, т.к. ошибка может привести к затиранию лишних данных. По той же причине для операций обновления и удаления в СУБД могут потребоваться дополнительные права доступа. Убедитесь, что они у вас есть.

Синтаксис оператора DELETE ещё проще, чем обновление данных:

DELETE FROM Teachers
WHERE teacher_id = 936;

После DELETE FROM указано имя таблицы Teachers - в ней производится удаление. А после WHERE - обязательно - условие, указывающее на конкретную строку. Иначе бы были удалены все строки таблицы.

Внешние ключи foreign key и ссылочная целостность

В главе JOIN-ы мы с вами рассматривали объединения таблиц и говорили о том, что в них должны быть поля, по которым будет происходить сопоставление. Ещё лучше, когда в роли таких полей выступают внешние ключи (foreign key) (примеры их создания можно посмотреть в приложении 1 к нашим урокам). Внешние ключи служат для создания связей и обеспечивают ссылочную целостность таблиц. Это означает, что мы не смогли бы создать новую строку в таблице Students, указав идентификатор group_id, не имеющий соответствующего значения group_id в таблице Groups: СУБД бы выдала ошибку. И также мы не сможем удалить из Groups запись с определённым group_id, если в таблице Students всё ещё присутствуют строки с таким же значением идентификатора. Ведь тогда запись о Студенте будет ссылаться на несуществующую Группу, что так же вызовет ошибку SQL. Хорошая практика - всегда определять внешние ключи в таблицах, т.к. это помогает сохранить целостность информации в БД.

DELETE или DELETE FROM
В различных СУБД синтаксис оператора удаления может отличаться: ключевое слово FROM может быть обязательным или нет. Для того, чтобы обеспечить переносимость кода (при смены СУБД), лучше указывать его в любом случае.

Что удаляет оператор DELETE?

  • Строки целиком, но не отдельные столбцы. Для удаления данных конкретного поля используется UPDATE
  • Отдельные строки, но не таблицу целиком. Удаление таблиц мы рассмотрим в следующем уроке

Если вам нужно очистить таблицу от всех строк, сохранив её описание, будет неудобно использовать запрос DELETE, т.к. он удаляет каждую строку отдельно. Для таких случаев есть оператор TRUNCATE TABLE.

Советы по применению UPDATE и DELETE

  • Никогда не выполняйте UPDATE и DELETE без условия WHERE, кроме случая, когда вы действительно хотите применить данное действие ко ВСЕМ строкам таблицы
  • Лучше всего в качестве условия WHERE указывать ссылку на первичный ключ (primary key) строки. Это максимально снизит вероятность ошибочных изменений
  • В качестве условия можно указывать одно, несколько или даже диапазон первичных ключей
  • Проверьте корректность задаваемого вами условия WHERE с помощью запроса SELECT, прежде чем запускать UPDATE или DELETE. Ведь в SQL не существует отмены операции, а значит, данные могут быть потеряны безвозвратно
  • Создавайте внешние ключи (foreign key) для связи данных между таблицами. Это послужит дополнительной защитой от нарушения целостности данных в БД
  • В некоторых СУБД есть возможность запретить выполнение UPDATE и DELETE без условия WHERE. Несомненно стоит воспользоваться ею.

Следующая страница. Работа с таблицами.
Оглавление.