Базы данных
В этом учебном пособии вы узнаете, как использовать Oracle оператор UPDATE с синтаксисом, примерами и практическими упражнениями.
Описание
Oracle оператор UPDATE используется для обновления существующих записей в таблице в базе данных Oracle. Есть 2 синтаксиса для UPDATE в Oracle в зависимости от того, что вы выполняете, традиционное обновление или обновление одной таблицы с данными из другой таблицы.
Синтаксис
Синтаксис оператора UPDATE при обновлении одной таблицы в Oracle/PLSQL:
ИЛИ
Синтаксис Oracle оператора UPDATE при обновлении одной таблицы с данными из другой таблицы:
Параметры или аргументы
column1 , column2 , … column_n
Столбцы, которые вы хотите обновить.
expression1 , expression2 , … expression_n
Новые значения присвоенные для column1 , column2 , … column_n . Так column1 будет присвоено значение expression1 , column2 будет присвоено значение expression2 , и так далее.
WHERE conditions
Необязательный. Условия, которые должны быть выполнены для обновления столбцов. Если не предусмотрено никаких условий, то все записи в таблице будут обновлены.
Пример обновления одного столбца
Рассмотрим очень простой пример Oracle UPDATE.
Команда UPDATE
Команда UPDATE — производит изменения в уже существующей записи или во множестве записей в таблице SQL. Изменяет существующие значения в таблице или в основной таблице представления.
Команда UPDATE Синтаксис команды
Синтаксис команды UPDATE
Команда UPDATE. Основные ключевые слова и параметры команды UPDATE
- schema — идентификатор полномочий, обычно совпадающий с именем некоторого пользователя
- table view — имя таблицы SQL, в которой изменяются данные; если определяется представление, данные изменяются в основной таблице SQL представления
- subquery_1 — подзапрос, который сервер обрабатывает тем же самым способом как представление
- сolumn— столбец таблицы SQL или представления SQL, значение которого изменяется; если столбец таблицы из предложения SET опускается, значение столбца остается неизменяемым
- expr— новое значение, назначаемое соответствующему столбцу; это выражение может содержать главные переменные и необязательные индикаторные переменные
- subquery_2 — новое значение, назначаемое соответствующему столбцу
- subquery_3 — новое значение, назначаемое соответствующему столбцу
WHERE — определяет диапазон изменяемых строк теми, для которых определенное условие является TRUE; если опускается эта фраза, модифицируются все строки в таблице или представлении.
При выдаче утверждения UPDATE включается любой UPDATE-триггер, определенный на таблице.
Подзапросы. Если предложение SET содержит подзапрос, он возвращает точно одну строку для каждой модифицируемой строки. Каждое значение в результате подзапроса назначается соответствующим столбцам списка в круглых скобках. Если подзапрос не возвращает никакие строки, столбцу назначается NULL. Подзапросы могут выбирать данные из модифицируемой таблицы. Предложение SET может совмещать выражения и подзапросы.
Команда UPDATE Пример 1
Изменение для всех покупателей рейтинга на значение, равное 200:
UPDATE Customers SET rating = 200;
Команда UPDATE Пример 2
Замена значения столбца во всех строках таблицы, как правило, используется редко. Поэтому в команде UPDATE, как и в команде DELETE, можно использовать предикат. Для выполнения указанной замены значений столбца rating, для всех покупателей, которые обслуживаются продавцом Giovanni (snum = 1003), следует ввести:
UPDATE Customers SET rating = 200 WHERE snum = 1001;
Команда SQL UPDATE Пример 3
В предложении SET можно указать любое количество значений для столбцов, разделенных запятыми:
UPDATE emp SET job = ‘MANAGER’, sal = sal + 1000, deptno = 20 WHERE ename = ‘JONES’;
Команда UPDATE Пример 4
В предложении SET можно указать значение NULL без использования какого-либо специального синтаксиса (например, такого как IS NULL). Таким образом, если нужно установить все рейтинги покупателей из Лондона (city = ‘London’) равными NULL-значению, необходимо ввести:
UPDATE Customers SET rating = NULL WHERE city = ‘London’;
Команда UPDATE Пример 5
Поясняет использование следующих синтаксических конструкций команды UPDATE:
- Обе формы предложения SET вместе в одном утверждении.
- Подзапрос.
- Предложение WHERE, ограничивающее диапазон модифицируемых строк.
UPDATE emp a SET deptno =
(SELECT deptno FROM dept WHERE loc = ‘BOSTON’), (sal, comm) = (SELECT 1.1*AVG(sal), 1.5*AVG(comm) FROM emp b WHERE a.deptno = b.deptno) WHERE deptno IN (SELECT deptno FROM dept WHERE loc = ‘DALLAS’ OR loc = ‘DETROIT’);
Вышеупомянутое утверждение UPDATE выполняет следующие операции:
- Модифицирует только тех служащих, кто работают в Dallas или Detroit
- Устанавливает значение колонки deptno для служащих из Бостона
- Устанавливает жалованье каждого служащего в 1.1 раз больше среднего жалованья всего отдела
- Устанавливает комиссионные каждого служащего в 1.5 раза больше средних комиссионных всего отдела
Вы должны войти, чтобы оставить комментарий.
Изучаем SQL
- 1. Введение в SQL
- 2. Запросы на выборку
- 3. Условия в запросах
- 4. Cортировка данных
- 5. Вставка записи
- 6. Вставка нескольких записей
- 7. Изменение записи
Под обновлением данных в БД подразумевается изменение значений в существующих записях таблицы. При этом возможно как изменение значений полей в группе строк (даже всех строк таблицы), так и правка значения поля отдельной строки.
В SQL, изменить запись в таблице БД можно с помощью команды UPDATE. В самом минимальном виде команда обновления данных выглядит следующим образом:
UPDATE таблица SET поле = значение
Здесь, UPDATE – команда указывающая, что запрос на обновление данных;
таблица – название таблицы, в которой будет проводиться изменения;
SET – команда, после которой через запятую указываются поля с назначаемыми им значениями;
поле – поле таблицы, в которое будет внесено изменение;
значение – новое значение, которое будет внесено в поле.
Например, если необходимо задать полю во всех строках таблицы значение равное нулю, можно выполнить такой запрос:
UPDATE goods SET price = 0
В этом случае, поле price абсолютно во всех имеющиеся строках таблицы примет значение 0.
Изменение одного значения
Изменение значения всех полей в таблице необходимо крайне редко. Чаще всего необходимо поменять значение какой-то конкретной записи. Для этого в завершении строки с командой UPDATE будет добавлена директива WHERE, в которой указывается условие, определяющее с какой именно строкой нужно выполнить операцию обновления.
num (номер товара) |
title (название) |
price (цена) |
1 | Чайник | 300 |
2 | Чашка | 100 |
3 | Ложка | 25 |
4 | Тарелка | 100 |
Для примера, нужно обновить стоимость товара с известным нам его значением num. Для этого, выполним следующий запрос:
UPDATE goods SET price = 150 WHERE num = 2
Теперь, перед операцией изменения полей, будет выбрана строка, удовлетворяющая условию num = 2. Такая строка в таблице одна. В этой стоке цена и будет изменена на значение 150. В результате получим таблицу с измененной ценой товара.
Внесение изменений в несколько строк с условием отбора
Если вспомнить все многообразие условий в запросе, можно представить себе насколько разнообразными могут быть выборки. Поэтому и запросы на обновления могут выполняться либо с одной строкой, либо с группой строк, либо со всеми строками таблицы. Все зависит от стоящей перед вами задачи, а так же с какими строками таблицы нужно выполнять операции обновления.
Например, мы хотим уменьшить в два раза цену всех товаров, которые сейчас стоят от 100 и более. Запрос:
UPDATE goods SET price = price / 2 WHERE price >= 100
Условие WHERE здесь содержит правило, по которому будут выбраны только товары с ценой равной или более 100, а те товары, цена у которых ниже 100, затронуты запросом не будут.
price = price / 2 – формула, по которой будет вычисляться новая цена товаров. Новая цена будет записана равной старой цене поделенной на два.
В результате выполнения такого запроса получим таблицу с измененными записями:
num (номер товара) |
title (название) |
price (цена) |
1 | Чайник | 150 |
2 | Чашка | 50 |
3 | Ложка | 25 |
4 | Тарелка | 50 |
Обновление значений в нескольких полях строки
При необходимости обновлять сразу несколько полей, все поля с их значениями указываются после директивы SET через запятую. Например, нужно изменить название и цену товара с кодом 2 на «утюг», стоимостью 300:
UPDATE goods SET title = "утюг" , price = 300 WHERE num = 2
Такой запрос каждому соответствующему полю в строке назначит его значение. А условие укажет, в какой именно строке будут выполнены изменения.
Выше приведены основные виды операций обновления. На их основе формируется запросы для решения большинства задач изменения данных в разработке с применением SQL.
Еще материалы из этого раздела
Комментарии
Добрый день!
А можно ли сделать так:
UPDATE goods SET title, price = 100 WHERE num = 2
То есть присвоить двум полям одно значение?
Добрый день, Анастасия.
Простейший вариант:
UPDATE goods SET price = (RAND() * 100) WHERE num = 2
Здесь назначается случайное число до 100, так как функция RAND() вернет дробное от 0 до 1. Поэтому еще стоит обратить внимание на тип поля, когда в БД запись заносится. В данном случае, без округления, вещественное может быть записано.
Добрый день, Василий.
Одна строка таблицы — это одна запись. Если вы хотите исправить в одной записи таблице (строке таблицы), то так и будет:
UPDATE goods SET title = "утюг", price = 300 WHERE num = 2
title = "утюг", price = 300 — для каждого столбца строки.
Добрый день, Василий.
Чтобы реализовать это именно одним запросом, можно сделать так. Но на мой взгляд, стоит делать проще и понятнее для себя. Ведь для сборки этого запроса вы так же будете использовать цикл. Вопрос в том, что эффективнее: реализовать циклически сложный запрос или циклически выполнить несколько простых запросов.
Подобное решение, как мне кажется применимо, например, в обновлении прайс-листа. Но, т.к. задача не часто выполнимая, то нет смысла усложнять ее, пусть даже для повышения скорости выполнения. Хотя все зависит от конкретных условий.
Надеюсь, я ответил на ваш вопрос, Василий.
Есть простая таблица в sql. И по нажатию на кнопку сохранить выполняется сохранение изменений. Запрос такой:
$query = "UPDATE `comp` SET `comp_login`= ‘$comp_login’, `comp_name` = ‘$comp_name’, `see` = ‘$see’, `p_status` = ‘$p_status’, `comp_text` = ‘$comp_text’ WHERE `id_comp` = ‘$id_comp’ AND `id_clients` = ‘$id_clients’";
Значения переменных берутся с пост запроса. Примерно такие: $comp_login = mysql_real_escape_string($request[‘comp_login’]);
Вопрос: Мне нужно знать была ли обновлена строка. Даже если ничего не было изменено, то тоже нужно вернуть истину.
Если проверить так: if(mysql_affected_rows() >0) , то возвращается ложь, если ничего не было изменено.
А if(mysql_affected_rows() == -1) выполняется только, если есть конкретные ошибки. Т.е. в таблице есть стpока enum со значениями ‘0’,’1′. Если я в это поле отправляю текст, то ставит 0 и пишет нет ошибки.
Как обычно проверяют такие условия?
А можете ли помочь с таким вопросом:
Есть сайт технической поддержки. И есть пользователи, которые оставляют на нем заявку в компанию. На нем есть таблица с полями: id_client(id пользователя AI, PK), name_client(Имя потльзователя), status(один ко многим), date_r(дата регистрации).
Статусы у всех пользователей будут разные. Например:
у пользователя 1: открыто, отменено, закрыто, передано, принято.
у пользователя 2: открыто, отменено, закрыто, исполнено, в ожидании.
у каждого клиента должны быть видны несколько статусов для выбора (только ему принадлежащие), а у другого клиента (другие статусы, принадлежащие именно ко второму клиенту)
Статусы в любое время могут добавляться( не удаляются).
Я пока придумал только так:
1. вариант:
Вторая таблица такая: id_status, id_client, open, close, cancelled, sent, accepted.
id_status — AI PK, id_client — указывает на первую таблицу на пользователя, другие поля сами статусы и имеют значение enum: ‘0’, ‘1’ — в зависимости присутствует для пользователя ставиться 0 или 1.
Когда необходимо добавлять статус какому либо клиенту сначала ставлю 1 для нужного пользователя, а для всех других проставляю 0.
2 Вариант.
Во второй таблице statuses (id_statuses, name_status) записаны все статусы. В таблице пользователя в поле status записать несколько значений id_statuses разделенных разделителями, которые принадлежат ему.
Может можно реализовать попроще?
Добрый день, Иван.
Не знаю, правильно ли я понял вопрос.
Я бы сделал гораздо больше таблиц: пользователи, статусы, заявки, статусы_заявки. Последняя в случае, если одной заявке может соответствовать несколько статусов. Если нет, то она не нужна.
Например, если нужно чтобы пользователю могло быть назначено несколько статусов, то: сама таблица пользователя (id, имя, прочее), список_статусов (id, название, . ), статусы_пользователя (id, id_пользователя, id_статуса). Таим образом у вас будет обеспечена и целостность данных и не будет в таблицах не будет избыточности.