Запрос sql update: Оператор SQL UPDATE: примеры, синтаксис
Содержание
Оператор SQL UPDATE: примеры, синтаксис
Оператор SQL UPDATE используется для изменения значений в записях таблицы.
Оператор SQL UPDATE имеет следующий синтаксис:
UPDATE table_name SET expression [WHERE condition]
Напоминаю, что записи в квадратных скобках [] являются необязательными.
После ключевого слова SET должен идти список столбцов таблицы, которые следует изменить, и новые значения в формате Имя_столбца = значение.
Дополнительное условие, описываемое в операторе SQL WHERE, помогает более гибко совершать манипуляции данными.
Примеры оператора SQL UPDATE. Имеется следующая таблица Planets:
ID | PlanetName | Radius | SunSeason | OpeningYear | HavingRings | Opener |
1 | Mars | 3396 | 687 | 1659 | No | Christiaan Huygens |
2 | Saturn | 60268 | 10759.22 | — | Yes | — |
3 | Neptune | 24764 | 60190 | 1846 | Yes | John Couch Adams |
4 | Mercury | 2439 | 115.88 | 1631 | No | Nicolaus Copernicus |
5 | Venus | 6051 | 243 | 1610 | No | Galileo Galilei |
Пример 1. С помощью оператора SQL UPDATE изменить название планеты Neptune на Pluton:
UPDATE Planets SET PlanetName = 'Pluton' WHERE ID = 3
В этом примере условие оператора SQL WHERE является обязательным, так как без него все поля столбца PlanetName во всей таблице изменились бы на Pluton. В данном случае, нам приходит на помощь столбец ID, ибо он является Первичным ключом, позволяющим однозначно идентифицировать запись.
Выполним запрос оператором SQL SELECT, чтобы посмотреть изменения в записи:
SELECT * FROM Planets WHERE ID = 3
Результат:
ID | PlanetName | Radius | SunSeason | OpeningYear | HavingRings | Opener |
3 | Pluton | 24764 | 60190 | 1846 | Yes | John Couch Adams |
Пример 2. С помощью оператора SQL UPDATE у первых трех записей таблицы изменить значение наличия колец (HavingRings) на «No» и обнулить поле ID
Код примера для MS SQL Server:
UPDATE TOP(3) Planets SET HavingRings = 'No', ID = NULL
Код примера для MySQL:
UPDATE Planets SET HavingRings = 'No', ID = NULL LIMIT 3
Выполним проверку:
SELECT TOP(3) * FROM Planets
Результат:
ID | PlanetName | Radius | SunSeason | OpeningYear | HavingRings | Opener |
NULL | Mars | 3396 | 687 | 1659 | No | Christiaan Huygens |
NULL | Saturn | 60268 | 10759.22 | — | No | — |
NULL | Neptune | 24764 | 60190 | 1846 | No | John Couch Adams |
Запросы SQL для обновления данных (UPDATE)
Под обновлением данных в БД подразумевается изменение значений в существующих записях таблицы. При этом возможно как изменение значений полей в группе строк (даже всех строк таблицы), так и правка значения поля отдельной строки.
В 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 — редактирование записей в базе данных
Команда UPDATE редактирует записи в базе данных.
Какие записи для редактирования
задаются с помощью команды WHERE.
Команда WHERE не является обязательной, если ее не указать —
будут обновлены все записи в таблице. Будьте внимательны — так случайно можно
уничтожить все данные.
См. также команды
SELECT,
INSERT,
DELETE,
которые отвечают за получение, вставку и удаление записей.
Синтаксис
UPDATE имя_таблицы SET поле1=значение1, поле2=значение2, поле3=значение3...
WHERE условие_по_которому_следует_выбрать_строки
Примеры
Все примеры будут по этой таблице workers, если не сказано иное:
id айди | name имя | age возраст | salary зарплата |
---|---|---|---|
1 | Дима | 23 | 400 |
2 | Петя | 24 | 500 |
3 | Вася | 25 | 600 |
Пример
В данном примере работнику с id, равным 1 (то есть Диме), устанавливается возраст 30
и зарплата 1000:
UPDATE workers SET age=30, salary=1000 WHERE id=1
Таблица workers станет выглядеть так:
id айди | name имя | age возраст | salary зарплата |
---|---|---|---|
1 | Дима | 30 | 1000 |
2 | Петя | 24 | 500 |
3 | Вася | 25 | 600 |
Пример
В данном примере работнику с id, равным 1 (то есть Диме), устанавливается возраст 30:
UPDATE workers SET age=30 WHERE id=1
Таблица workers станет выглядеть так:
id айди | name имя | age возраст | salary зарплата |
---|---|---|---|
1 | Дима | 30 | 400 |
2 | Петя | 24 | 500 |
3 | Вася | 25 | 600 |
Пример
В данном примере работнику Пете устанавливается новое имя Коля:
UPDATE workers SET name='Коля' WHERE name='Петя'
Таблица workers станет выглядеть так:
id айди | name имя | age возраст | salary зарплата |
---|---|---|---|
1 | Дима | 23 | 400 |
2 | Коля | 24 | 500 |
3 | Вася | 25 | 600 |
Пример
В данном примере всем работникам устанавливается зарплата 1000
(так как не задано WHERE — наш запрос обновит все записи):
UPDATE workers SET salary=1000
Таблица workers станет выглядеть так:
id айди | name имя | age возраст | salary зарплата |
---|---|---|---|
1 | Дима | 23 | 1000 |
2 | Петя | 24 | 1000 |
3 | Вася | 25 | 1000 |
SQL — Запрос UPDATE
Запрос UPDATE используется для изменения существующих записей в таблице.
Вы можете использовать WHERE с запросом UPDATE, чтобы обновить выбранные строки, в противном случае будут затронуты все строки.
Синтаксис:
Базовый синтаксис запроса UPDATE с WHERE выглядит следующим образом:
UPDATE table_name SET column1 = value1, column2 = value2...., columnN = valueN WHERE [condition];
Вы можете объединить N число условий с помощью операторов AND или OR.
Пример:
Рассмотрим таблицу клиентов, имеющих следующие записи:
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Maxim | 35 | Moscow | 21000.00 | | 2 | AndreyEx | 38 | Krasnodar | 55500.00 | | 3 | Oleg | 33 | Rostov | 34000.00 | | 4 | Masha | 35 | Moscow | 31500.00 | | 5 | Ruslan | 34 | Omsk | 43000.00 | | 6 | Dima | 32 | SP | 45000.00 | | 7 | Roma | 34 | SP | 10000.00 | +----+----------+-----+-----------+----------+
Ниже приведен пример, который будет обновлять ADDRESS для клиента с идентификатором 6:
SQL> UPDATE CUSTOMERS SET ADDRESS = 'Rostov' WHERE ID = 6;
Теперь таблица CUSTOMERS будет иметь следующую информацию:
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Maxim | 35 | Moscow | 21000.00 | | 2 | AndreyEx | 38 | Krasnodar | 55500.00 | | 3 | Oleg | 33 | Rostov | 34000.00 | | 4 | Masha | 35 | Moscow | 31500.00 | | 5 | Ruslan | 34 | Omsk | 43000.00 | | 6 | Dima | 32 | Rostov | 45000.00 | | 7 | Roma | 34 | SP | 10000.00 | +----+----------+-----+-----------+----------+
Если вы хотите изменить все значения ADDRESS и столбцов SALARY в таблице CUSTOMERS, вам не нужно использовать WHERE, и запрос UPDATE будет выглядеть следующим образом:
SQL> UPDATE CUSTOMERS SET ADDRESS = 'Rostov', SALARY = 25000.00;
Теперь таблица CUSTOMERS будет иметь следующие документы:
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Maxim | 35 | Rostov | 25000.00 | | 2 | AndreyEx | 38 | Rostov | 25000.00 | | 3 | Oleg | 33 | Rostov | 25000.00 | | 4 | Masha | 35 | Rostov | 25000.00 | | 5 | Ruslan | 34 | Rostov | 25000.00 | | 6 | Dima | 32 | Rostov | 25000.00 | | 7 | Roma | 34 | Rostov | 25000.00 | +----+----------+-----+-----------+----------+
Более подробные примеры можно посмотреть в гиде: 11 основных примеров команды UPDATE в MySQL.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
11 основных примеров команды UPDATE в MySQL
Одной из наиболее распространенных операций в MySQL является изменение существующего значения записи в таблице.
В этой статье мы расскажем, как использовать команду UPDATE в MySQL вместе с некоторыми полезными примерами.
Рассматриваются в данном руководстве следующие примеры:
- Обновление всех строк
- Обновление только выбранных строк
- Обновление значение столбца с выражением
- Использование ключевого слова DEFAULT в Update
- Обновление нескольких столбцов
- Используя условие LIMIT в обновлении
- Множественное обновление таблиц (с помощью Inner Join)
- Множественное обновление таблиц (с помощью Left Join)
- Возврат обновленного значения (или Pre-Update Value)
- Случай объединения или IF с Update
- Зачем использовать ORDER BY с Update?
Для этого урока мы будем использовать следующую таблицу worker в качестве примера. Это структура таблицы для примера.
mysql> DESC worker; +--------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(20) | YES | | NULL | | | dept | varchar(10) | YES | | Sales | | | salary | int(10) | YES | | NULL | | +--------+-------------+------+-----+---------+----------------+
В настоящее время таблица worker имеет следующие записи.
mysql> SELECT * FROM worker; +-----+--------+------------+--------+ | id | name | dept | salary | +-----+--------+------------+--------+ | 100 | Andrey | Sales | 5000 | | 200 | Anton | IT | 5500 | | 300 | Maxim | IT | 7000 | | 400 | Dimon | Marketing | 9500 | | 500 | Anton | IT | 6000 | | 501 | Anna | Accounting | NULL | +-----+--------+------------+--------+
Если вы новичок в MySQL, вероятно, вы должны сначала понять основы MySQL , включая , как создать базу данных MySQL.
1. Обновление всех строк
В следующем простом примере, команда UPDATE будет установлено значение столбца DEPT к IT для всех строк в таблице worker.
mysql> UPDATE worker SET dept='IT '; Query OK, 3 rows affected (0.02 sec) Rows matched: 6 Changed: 3 Warnings: 0
Вывод команды UPDATE будет иметь следующие две строки:
- Строка 1: “Query OK”, если запрос был выполнен. Если есть ошибка синтаксиса, он будет отображать его здесь. Даже если она не обновляла какие-либо записи, эта строка будет по-прежнему говорить “Query OK”, пока не было никаких ошибок синтаксиса и утверждение было чистым. Эта линия также покажет, сколько записей были обновлены по этому запросу (например: 3 rows affected). И, наконец, это также покажет, сколько времени потребовалось для MySQL для выполнения запроса (например: 0,02 секунды).
- Строка 2: Скажет, сколько записей, согласованы условием утверждения обновлений. В этом примере нет WHERE условие, нет ограничений на количество записей, которые следует учитывать для обновления (так, он говорит: Rows matched: 6). Далее, покажет, сколько записей действительно были обновлены (например: Changed: 3). Наконец, он покажет, как много предупреждений там, во время обновления. Довольно много в большинстве случаев, вы увидите предупреждения как 0, когда все работало правильно.
Вот обновленные записи после вышеуказанной команды UPDATE.
mysql> SELECT * FROM worker; +-----+--------+------------+--------+ | id | name | dept | salary | +-----+--------+------------+--------+ | 100 | Andrey | IT | 5000 | | 200 | Anton | IT | 5500 | | 300 | Maxim | IT | 7000 | | 400 | Dimon | IT | 9500 | | 500 | Anton | IT | 6000 | | 501 | Anna | IT | NULL | +-----+--------+------------+--------+
2. Обновление только выбранных строк
Вместо того, чтобы обновить все записи, вы можете выборочно обновить определенные записи на основе условия WHERE.
В следующем примере будет обновлять таблицу сотрудников и назначить сотрудника, который имеют зарплату больше или равно 7000 для отдела маркетинга.
mysql> UPDATE worker SET dept='Marketing' WHERE salary >=7000; Query OK, 2 rows affected (0.01 sec) Rows matched: 2 Changed: 2 Warnings: 0
Были только две записи, которые соответствовали выше, таблица обновилась, как показано ниже.
mysql> SELECT * FROM worker; +-----+--------+------------+--------+ | id | name | dept | salary | +-----+--------+------------+--------+ | 100 | Andrey | IT | 5000 | | 200 | Anton | IT | 5500 | | 300 | Maxim | Marketing | 7000 | | 400 | Dimon | Marketing | 9500 | | 500 | Anton | IT | 6000 | | 501 | Anna | IT | NULL | +-----+--------+------------+--------+
Мы обсуждали много различных практических условий WHERE в нашем учебнике MySQL по команде SELECT. Это очень полезно, чтобы понять, как использовать предложение WHERE эффективно во время UPDATE: 25 основных примеров в MySQL для команды SELECT.
3. Обновление значения столбца с выражением
При присвоении значения в столбце после SET, вы не всегда должны указывать статические значения. Вы также можете использовать выражения, как показано ниже.
Ниже приводится очень простое выражение, где оно увеличивает значение заработной платы на 500 для всех сотрудников отдела IT.
mysql> UPDATE worker SET salary=salary+500 WHERE dept='IT'; Query OK, 3 rows affected (0.01 sec) Rows matched: 4 Changed: 3 Warnings: 0
Были только 4 записи, которые соответствовали условию выше. Но только три записи были обновлены, как показано ниже, в качестве одного из записей сотрудников, который принадлежит к техническому отделу, имел нулевое значение в поле заработной платы. Таким образом, зарплата выше + 500 выражение по прежнему NULL, и не обновляется эта конкретную запись.
mysql> SELECT * FROM worker; +-----+--------+------------+--------+ | id | name | dept | salary | +-----+--------+------------+--------+ | 100 | Andrey | IT | 5500 | | 200 | Anton | IT | 6000 | | 300 | Maxim | Marketing | 7000 | | 400 | Dimon | Marketing | 9500 | | 500 | Anton | IT | 6500 | | 501 | Anna | IT | NULL | +-----+--------+------------+--------+
4. Использование ключевого слова
DEFAULT в Update
Вместо того, чтобы указать статическое значение или выражение, вы также можете использовать ключевое слово “DEFAULT”, когда вы присваиваете значение столбца после SET.
Если вы посмотрите на вывод “DESC worker”, показанного ниже, вы увидите, что столбец с именем по умолчанию. Как вы видите там, зарплата имеет значение по умолчанию NULL. Отдел имеет значение по умолчанию продаж.
mysql> DESC worker; +--------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(20) | YES | | NULL | | | dept | varchar(10) | YES | | Sales | | | salary | int(10) | YES | | NULL | | +--------+-------------+------+-----+---------+----------------+
Во-первых, давайте обновим столбец зарплаты по умолчанию, используя ключевое слово DEFAULT, как показано ниже.
mysql> UPDATE worker SET salary=DEFAULT; Query OK, 5 rows affected (0.03 sec) Rows matched: 6 Changed: 5 Warnings: 0
Затем обновите столбец отдела до значения по умолчанию, используя ключевое слово DEFAULT, как показано ниже.
mysql> UPDATE worker SET dept=DEFAULT; Query OK, 6 rows affected (0.00 sec) Rows matched: 6 Changed: 6 Warnings: 0
Как видно из следующих выходных данных, мы можем видеть, что ключевое слово DEFAULT взял соответствующие значения по умолчанию из определения таблицы сотрудников, и использовали их, чтобы обновить его. Колонка Департамент получил обновление до продаж и зарплата обновлена до NULL, как показано ниже.
mysql> SELECT * FROM worker; +-----+--------+-------+--------+ | id | name | dept | salary | +-----+--------+-------+--------+ | 100 | Andrey | Sales | NULL | | 200 | Anton | Sales | NULL | | 300 | Maxim | Sales | NULL | | 400 | Dimon | Sales | NULL | | 500 | Anton | Sales | NULL | | 501 | Anna | Sales | NULL | +-----+--------+-------+--------+
5. Обновление нескольких столбцов
В одном операторе обновления, вы также можете обновить значения для более чем одного столбца, как показано ниже.
В следующем примере, мы присваивая значения как зарплаты и столбца DEPT для всех записей, где идентификатор сотрудника больше 300.
mysql> UPDATE worker SET salary=5000, dept='Marketing' WHERE id > 300; Query OK, 3 rows affected (0.04 sec) Rows matched: 3 Changed: 3 Warnings: 0
Как видно из следующего вывода, вышеприведенная команда UPDATE обновляет два значения столбца в течение последних трех записей, которые соответствовали выше, когда выполняется условие.
mysql> SELECT * FROM worker; +-----+--------+-----------+--------+ | id | name | dept | salary | +-----+--------+-----------+--------+ | 100 | Andrey | Sales | NULL | | 200 | Anton | Sales | NULL | | 300 | Maxim | Sales | NULL | | 400 | Dimon | Marketing | 5000 | | 500 | Anton | Marketing | 5000 | | 501 | Anna | Marketing | 5000 | +-----+--------+-----------+--------+
Кроме того, помимо получения хорошую статьи на команде UPDATE в MySQL, очень полезно, чтобы понять все доступные операции MySQL INSERT: 12 основных примеров в MySQL для команды INSERT.
6. Ограничение колличества записей при обновлении
Мы также можем использовать опцию LIMIT, чтобы ограничить количество записей, которые должны быть обновлены.
Даже если условие, где соответствует несколько записей, оператор обновления будет обновлять только 1-е X количество записей, указанных в значении LIMIT.
В следующем примере мы присваиваем зарплату всех записей до 6500, так как мы не имеем WHERE. Но, мы используем LIMIT 3. Это означает, что она будет обновлять зарплату только первым трем записям для условия согласования.
mysql> UPDATE worker SET salary=6500 LIMIT 3; Query OK, 3 rows affected (0.01 sec) Rows matched: 3 Changed: 3 Warnings: 0
Как видно из следующего выхода, только 1-е три записи обновляются предыдущей командой.
mysql> SELECT * FROM worker; +-----+--------+-----------+--------+ | id | name | dept | salary | +-----+--------+-----------+--------+ | 100 | Andrey | Sales | 6500 | | 200 | Anton | Sales | 6500 | | 300 | Maxim | Sales | 6500 | | 400 | Dimon | Marketing | 5000 | | 500 | Anton | Marketing | 5000 | | 501 | Anna | Marketing | 5000 | +-----+--------+-----------+--------+
Одна вещь, чтобы иметь в виду, что LIMIT 3 на самом деле не означает, что обновление будет продолжать идти, пока он не обновит 3 записей. Вместо этого оператор обновления прекратит выполнение, как только он обработал первые 3 строки, которые соответствовали условию выполнения, независимо от того, были ли действительно обновлены эти записи или нет.
7. Многократное обновление таблиц (с помощью Inner Join)
Можно также объединить две таблицы во время обновления. Можно также обновить значения из двух таблиц одновременно с помощью одного оператора обновления.
В этом примере мы будем использовать в таблице следующие преимущества наряду с нашей существующей таблицей сотрудников.
mysql> SELECT * from benefits; +------------+-------+ | dept | bonus | +------------+-------+ | Sales | 1000 | | IT | NULL | | Marketing | 800 | +------------+-------+
Следующее утверждение обновление будет увеличивать значение столбца заработной платы из таблицы сотрудников к значению, указанному в таблице льгот для соответствующего столбца DEPT.
Это означает, что мы должны объединить оба работника и таблицу преимущества во время обновления, как показано ниже. Используйте общее поле между этими двумя таблицами в предложении WHERE. В этом примере общее поле dept.
Кроме того, сразу после ключевого слова UPDATE укажите имя обоих таблиц, как показано ниже. После ключевого слова SET можно указать либо имя одного или нескольких столбцов, которые должны быть обновлены, либо из одной таблицы, или как в таблице.
mysql> UPDATE worker,benefits -> SET worker.salary=worker.salary+benefits.bonus -> WHERE worker.dept=benefits.dept and benefits.bonus is not null; Query OK, 4 rows affected (0.01 sec) Rows matched: 4 Changed: 4 Warnings: 0
Обратите внимание, что в приведенном выше обновлении, мы используем внутреннее соединение.
Ниже приведен вывод после того, как приведенное выше утверждение обновление было выполнено. Как вы видите ниже, зарплата работника получила увеличивается на основе значений из таблицы выгоды.
mysql> SELECT * FROM worker; +-----+--------+------------+--------+ | id | name | dept | salary | +-----+--------+------------+--------+ | 100 | Andrey | Sales | 7500 | | 200 | Anton | Sales | 7500 | | 300 | Maxim | IT | 6500 | | 400 | Dimon | IT | 5000 | | 500 | Anton | Marketing | 5800 | | 501 | Anna | Marketing | 5800 | +-----+--------+------------+--------+
8. Множественное обновление таблиц (с помощью Left Join)
Аналогично предыдущему примеру внутреннего соединения, мы можем также использовать левое соединение.
Когда мы используем внутреннее соединение, мы не указываем ключевое слово “inner join”, так как это по умолчанию при объединении нескольких таблиц.
Однако при использовании соединения слева мы должны явно указать “left join”, как показано ниже.
mysql> UPDATE worker LEFT JOIN benefits on worker.dept = benefits.dept -> SET worker.salary = worker.salary+500 -> WHERE benefits.bonus is null; Query OK, 2 rows affected (0.03 sec) Rows matched: 2 Changed: 2 Warnings: 0
Вот выход после вышеуказанного обновления.
mysql> SELECT * FROM worker; +-----+--------+------------+--------+ | id | name | dept | salary | +-----+--------+------------+--------+ | 100 | Andrey | Sales | 7500 | | 200 | Anton | Sales | 7500 | | 300 | Maxim | IT | 7000 | | 400 | Dimon | IT | 5500 | | 500 | Anton | Marketing | 5800 | | 501 | Anna | Marketing | 5800 | +-----+--------+------------+--------+
9. Возврат обновленного значения (или Pre-Update Value)
В MySQL в команде обновления, нет никакого прямого способа получения нового значения обновлений.
Например, в PostgreSQL, мы можем использовать что-то вроде этого: “UPDATE table_name SET column_name = expression WHERE condition RETURNING column_name”. В MySQL, мы не имеем возвращения как часть команды обновления MySQL.
Но, вы можете сделать следующее, чтобы получить возвращаемое значение внутри вашей процедуры, пакета, функции или из командной строки.
mysql> UPDATE worker SET salary = salary+500 WHERE id=400; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> SELECT salary AS tmp_salary FROM worker WHERE id=400; +------------+ | tmp_salary | +------------+ | 5500 | +------------+
В приведенном выше примере, после того, как обновление будет сделано, переменная tmp_salary имеет обновленную зарплату от идентификатора сотрудника
Если вы хотите получить значение зарплаты, прежде чем обновление было сделано, очевидно, вы просто должны переключить последовательность из двух вышеупомянутых утверждений. В этом случае будет сначала SELECT, а затем UPDATE.
Или, вы можете использовать “@” в качестве части заявления UPDATE и получить предварительно обновленное значение, как показано ниже.
UPDATE worker SET salary = salary+500 WHERE id=400 AND @tmp_salary := salary
В приведенной выше команде обновления, после того, как обновление будет сделано, переменная tmp_salary имеет предварительно обновляемую зарплату для сотрудников ID 400. Как вы видите здесь, хотя значение заработной платы уже обновлено до 6000. Переменная tmp_salary, которая использовалась в приведенной выше команде UPDATE по-прежнему имеет значение 5500.
mysql> SELECT * FROM worker WHERE id = 400; +-----+-------+------------+--------+ | id | name | dept | salary | +-----+-------+------------+--------+ | 400 | Dimon | IT | 6000 | +-----+-------+------------+--------+ mysql> SELECT @tmp_salary; +-------------+ | @tmp_salary | +-------------+ | 5500 | +-------------+
10. Случай объединения или IF с Update
Вы также можете использовать условные обновления MySQL с помощью условных команд, как CASE, IF и т.д. Это полезно для упрощения обновления.
Вместо того чтобы использовать несколько обновлений, вы можете просто обойтись с помощью одной команды UPDATE, которая сочетает в себе все ваши операции.
Например, скажем, у нас есть следующие три оператора обновления, которые обновляют поле заработной платы на основе значения из поля отдела.
UPDATE worker SET salary = salary+1000 WHERE dept = 'Sales'; UPDATE worker SET salary = salary+500 WHERE dept = 'IT '; UPDATE worker SET salary = salary+800 WHERE dept = 'Marketing';
Вы можете объединить все перечисленные выше заявления трех UPDATE в одном заявлении UPDATE используя условие CASE, как показано ниже.
UPDATE worker SET salary = CASE dept WHEN 'Sales' THEN salary+1000 WHEN 'IT ' THEN salary+500 WHEN 'Marketing' THEN salary+500 ELSE salary END;
Так же, как CASE, вы можете также использовать IF условие для обновления значения столбца соответственно.
11. Зачем использовать ORDER с пунктом Update?
Вы можете использовать значение ORDER BY во время обновления. Предложения ORDER BY, безусловно, имеет смысл во время SELECT. Но, зачем нам нужен ORDER BY во время обновления.
Скажем, у вас есть уникальный идентификатор и поле идентификатор сотрудника таблицы.
Когда вы выполните следующую команду, чтобы увеличить идентификатор сотрудника на 100, вы можете получить сообщение об ошибке дубликатом.
mysql> UPDATE contractor set id=id+100; ERROR 1062 (23000): Duplicate entry '200' for key 'PRIMARY'
Это происходит потому, что, когда он пытается обновить значение идентификатора от 100 до 200, то уже есть существующая запись с идентификатором, как 200. Поле ID также имеет уникальный UNIQUE, в данном случае это является PRIMARY ключом. Таким образом, мы получаем вышеуказанную ошибку.
Для этого мы должны выполнить следующую команду с ORDER BY с идентификатором Desc.
mysql> UPDATE worker SET id=id+100 order by id desc; Query OK, 6 rows affected (0.01 sec) Rows matched: 7 Changed: 7 Warnings: 0
В приведенном выше случае, сначала начните с максимального идентификатора сотрудника, обновлять эту запись, а затем переходить к следующему. Таким образом, он никогда не будет иметь сценарий повторяющегося значения в процессе обновления.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Изменение записей в таблице с помощью запроса update SQL: синтаксис и пример
От автора: запрос UPDATE SQL используется для изменения существующих записей в таблице. Вы можете использовать с запросом UPDATE условие WHERE для обновления выбранных строк, иначе будут изменены все строки.
Синтаксис
Основной синтаксис запроса UPDATE с условием WHERE выглядит следующим образом:
UPDATE имя_таблицы
SET столбец1 = значение1, столбец2 = значение2…., столбецN = значениеN
WHERE [условие];
UPDATE имя_таблицы SET столбец1 = значение1, столбец2 = значение2…., столбецN = значениеN WHERE [условие]; |
Вы можете комбинировать N-ное количество условий с помощью операторов AND или OR.
Бесплатный курс по PHP программированию
Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC
В курсе 39 уроков | 15 часов видео | исходники для каждого урока
Получить курс сейчас!
Пример
Рассмотрим таблицу CUSTOMERS, содержащую следующие записи:
Следующий запрос обновляет поле ADDRESS для клиента, чей идентификатор в таблице равен 6.
UPDATE CUSTOMERS
SET ADDRESS = ‘Pune’
WHERE ID = 6;
UPDATE CUSTOMERS SET ADDRESS = ‘Pune’ WHERE ID = 6; |
Теперь таблица CUSTOMERS будет содержать следующие записи:
Если вы хотите изменить все значения столбца ADDRESS и SALARY в таблице CUSTOMERS, вам не нужно использовать условие WHERE, просто запроса UPDATE будет достаточно, как показано в следующем блоке кода.
UPDATE CUSTOMERS
SET ADDRESS = ‘Pune’, SALARY = 1000.00;
UPDATE CUSTOMERS SET ADDRESS = ‘Pune’, SALARY = 1000.00; |
Теперь таблица CUSTOMERS будет содержать следующие записи:
Источник: //www.tutorialspoint.com/
Редакция: Команда webformyself.
Бесплатный курс по PHP программированию
Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC
В курсе 39 уроков | 15 часов видео | исходники для каждого урока
Получить курс сейчас!
Хотите изучить MySQL?
Посмотрите курс по базе данных MySQL!
Смотреть
Команда SQL для удаления и обновление данных в базе (DELETE, UPDATE)
В базу данных можно не только добавлять данные, но и удалять их оттуда. Ещё существует возможность обновить данные в базе. Рассмотрим оба случая.
Удаление данных из базы (DELETE)
Удаление из базы данных происходит с помощью команды «DELETE» (переводится с английского как «УДАЛИТЬ»). Функция удаляет не одну строку, а несколько, при этом выбирает для удаления строки по логике функции «SELECT». То есть чтобы удалить данные из базы, необходимо точно определить их. Приведём пример SQL команды для удаления одной строчки:
DELETE FROM `USERS` WHERE `ID` = 2 LIMIT 1;
Благодаря этому запросу из таблицы «USERS» будет удалена одна запись, у которой в столбце «ID» стоит значение «2».
Обратите внимание, что в конце запроса стоит лимит на выборку «LIMIT 1;» размером в 1 строку. Его можно было не ставить, если поле «ID» является «PRIMARY KEY» (первичный ключ, то есть содержит только уникальные значения). Но всё-таки рекомендуем ставить ограничение «LIMIT 1;» в любом случае, если вы намерены удалить только одну строчку.
Теперь попробуем удалить сразу диапазон данных. Для этого достаточно составить запрос, в результате выполнения которого вернётся несколько строк. Все эти строки будут удалены:
DELETE FROM `USERS` WHERE `ID` >= 5;
Этот запрос удалит все строки в таблицы, у которых в столбце «ID» стоит значение меньше 5. Если не поставить никакого условия «WHERE» и лимита «LIMIT», то будут удалены абсолютно все строки в таблице:
DELETE FROM `USERS`;
На некоторых версиях MySQL способ удаления всех строк через «DELETE FROM _;» может работать медленнее, чем «TRUNCATE _;«; Поэтому для очистки всей таблицы лучше всё-таки использовать «TRUNCATE».
Обновление данных в базе (UPDATE)
Функция обновления «UPDATE» (переводится с английского как «ОБНОВИТЬ») довольно часто используется в проектах сайтов. Как и в случае с функцией «DELETE», фкнция обновления не успокоится до тех пор, пока не обновит все поля, которые подходят под условия, если нет лимита на выборку. Поэтому необходимо задавать однозначные условия, чтобы вместо одной строки нечаянно не обновить половину таблицы. Приведём пример использования команды «UPDATE»:
UPDATE `USERS` SET `NAME` = 'Мышь' WHERE `ID` = 3 LIMIT 1;
В этом примере, в таблие «USERS» будет установлено значение «Мышь» в столбец «NAME» у строки, в столбце «ID» которой стоит значение «3». Можно обновить сразу несколько столбцов у одной записи, передав значения через запятую. Попробуем обновить не только значение с толбце «NAME», но и значение в столбце «FOOD» используя один запрос:
UPDATE `USERS` SET `NAME` = 'Мышь', `FOOD` = 'Сыр' WHERE `ID` = 3 LIMIT 1;
Если не поставить никаких лимитов LIMIT и условий WHERE, то все записи таблицы будут обновлены без исключений.
SQL | Оператор UPDATE — GeeksforGeeks
Оператор UPDATE в SQL используется для обновления данных существующей таблицы в базе данных. Мы можем обновлять отдельные столбцы, а также несколько столбцов, используя оператор UPDATE в соответствии с нашим требованием.
Базовый синтаксис
UPDATE имя_таблицы SET column1 = value1, column2 = value2, ... ГДЕ условие; table_name: имя таблицы column1 : имя первого, второго, третьего столбца.... значение1 : новое значение для первого, второго, третьего столбца .... условие : условие выбора строк, для которых значения столбцов необходимо обновить.
ПРИМЕЧАНИЕ: В приведенном выше запросе оператор SET используется для установки новых значений в конкретный столбец, а предложение WHERE используется для выбора строк, столбцы которых необходимо обновить. Если мы не использовали предложение WHERE, тогда столбцы в всех строк будут обновлены.Таким образом, предложение WHERE используется для выбора конкретных строк.
Примеры запросов
- Обновление одного столбца : Обновите ИМЯ столбца и установите значение «PRATIK» во всех строках, где возраст равен 20.
UPDATE Student SET NAME = «PRATIK» WHERE Age = 20;
Выход:
Этот запрос обновит две строки (третья строка и пятая строка), и таблица Student теперь будет выглядеть так:ROLL_NO NAME ADDRESS ТЕЛЕФОН Возраст 1 RAM Delhi XXXXXXXXXX 18 2 RAMESXX GURGAON XXX54 3 PRATIK ROHTAK XXXXXXXXXX 20 4 SURESH Дели XXXXXXXXXX 18 3 ROHTAK ROHTAX 900XXXXXXX 2 РАМЕШ ГУРГАОН XXXXXXX XXX 18
- Обновление нескольких столбцов: Обновите ИМЯ столбца на «PRATIK» и АДРЕС на «SIKKIM», где ROLL_NO равно 1.
ОБНОВЛЕНИЕ НАБОР учеников NAME = 'PRATIK', ADDRESS = 'SIKKIM' WHERE ROLL_NO = 1;
Выход :
Приведенный выше запрос обновит два столбца в первой строке, и таблица Студент теперь будет выглядеть так:ROLL_NO ИМЯ АДРЕС ТЕЛЕФОН Возраст 1 PRATIK SIKKIM XXXXXXXXXX 18 2 RAMESH GURGAON XXXXXX54 GURGAON XXXXXX74 PRATIK
ROHTAK XXXXXXXXXX 20 4 SURESH Дели XXXXXXXXXX 18 3 PRATIK ROHTAXX57 РАМЕШ ГУРГАОН XXXXXXXXXX 18 Примечание: Для обновления нескольких столбцов мы использовали запятую (,) для разделения имен и значений двух столбцов.
- Отсутствие предложения WHERE: Если мы опустим предложение WHERE в запросе на обновление, все строки будут обновлены.
ОБНОВЛЕНИЕ НАБОР учеников = 'PRATIK';
Вывод:
Таблица Студент теперь будет выглядеть так:ROLL_NO ИМЯ АДРЕС ТЕЛЕФОН 75 Возраст 1 PRATIK Дели XXXXXXXXXX 18 2 PRATIK GURGAON XXXXXXXXXX 18 3 PRATIK 900K57 XXX 2054 4 PRATIK Delhi XXXXXXXXXX 18 3 PRATIK ROHTAK XXXXXXXXXX 20 900XXXXXXX
20 900XXXXXX
20 900XXXXXXX
GXXX GXXX GXXX GXX
Это Статья предоставлена Harsh Agarwal .Если вам нравится GeeksforGeeks, и вы хотели бы внести свой вклад, вы также можете написать статью с помощью provide.geeksforgeeks.org или отправить ее по электронной почте на [email protected]. Посмотрите, как ваша статья появляется на главной странице GeeksforGeeks, и помогите другим гикам.
Пожалуйста, напишите комментарий, если вы обнаружите что-то неправильное, или если вы хотите поделиться дополнительной информацией по теме, обсуждаемой выше.
Вниманию читателя! Не прекращайте учиться сейчас. Ознакомьтесь со всеми важными концепциями теории CS для собеседований SDE с помощью курса CS Theory Course по приемлемой для студентов цене и будьте готовы к отрасли.
Оператор SQL UPDATE — обновление данных в таблице
Сводка : в этом руководстве вы узнаете, как использовать оператор SQL UPDATE для изменения существующих данных в таблице.
Синтаксис SQL UPDATE
Оператор UPDATE
изменяет существующие данные в одной или нескольких строках таблицы. Ниже показан синтаксис оператора UPDATE
:
Таблица UPDATE ЗАДАВАТЬ column1 = новое_значение1, столбец2 = новое_значение2, ... КУДА условие;
Чтобы обновить данные в таблице, вам необходимо:
- Сначала укажите имя таблицы, данные которой вы хотите изменить, в предложении
UPDATE
. - Во-вторых, назначьте новое значение столбцу, который вы хотите обновить. Если вы хотите обновить данные в нескольких столбцах, каждая пара столбец = значение разделяется запятой (,).
- В-третьих, укажите, какие строки вы хотите обновить, в предложении WHERE. Предложение
WHERE
является необязательным.Если вы опустите предложениеWHERE
, все строки в таблице будут обновлены.
Ядро базы данных выдает сообщение с указанием количества затронутых строк после выполнения инструкции.
Примеры операторов SQL UPDATE
Давайте рассмотрим некоторые примеры использования оператора UPDATE
с таблицей сотрудников
:
SQL UPDATE пример одного столбца
Предположим, Джанет, у которой есть идентификатор сотрудника 3, выходит замуж, чтобы нужно изменить ее фамилию в таблице сотрудников
.
Запись Джанет в сотрудниках до обновления выглядит следующим образом:
ВЫБРАТЬ идентификатор сотрудника, фамилия, имя ИЗ northwind_bk.employees КУДА employeeid = 3;
Следующее заявление изменяет фамилию Джанет с Леверинг на Хилл:
Язык кода: JavaScript (javascript)
ОБНОВЛЕНИЕ сотрудников ЗАДАВАТЬ lastname = 'Холм' КУДА employeeID = 3;
Выполните указанную выше инструкцию SELECT еще раз, чтобы проверить изменение:
SQL UPDATE несколько столбцов
Например, Джанет переехала в новый дом, поэтому ее адрес изменился.Теперь вам нужно изменить его в таблице сотрудников
, используя следующий оператор:
Язык кода: JavaScript (javascript)
UPDATE сотрудников ЗАДАВАТЬ адрес = '1300 Carter St', city = 'Сан-Хосе', почтовый индекс = 95125, region = 'CA' КУДА employeeID = 3;
SQL UPDATE несколько строк
Следующий оператор UPDATE
увеличивает зарплату на 2% для сотрудников, чья зарплата меньше 2000 долларов:
UPDATE сотрудников ЗАДАВАТЬ зарплата = зарплата * 1.02 КУДА зарплата <2000;
Повышение по службе получили сотрудники с зарплатой менее 2К.
SQL UPDATE из SELECT
Следующий запрос выбирает продавца, который отвечал за более чем 100 заказов:
Язык кода: PHP (php)
SELECT идентификатор сотрудника, COUNT (идентификатор заказа) ИЗ заказы КУДА shippeddate НЕ ПУСТО ГРУППА ПО идентификатору сотрудника HAVING COUNT (orderid)> 100;
Следующий запрос увеличивает зарплату лучших продавцов на 5%.Идентификаторы лучших продавцов предоставляются с помощью подзапроса.
Язык кода: PHP (php)
ОБНОВЛЕНИЕ сотрудников ЗАДАВАТЬ зарплата = зарплата * 1,05 КУДА идентификатор сотрудника IN (ВЫБРАТЬ идентификатор сотрудника ИЗ (ВЫБРАТЬ идентификатор сотрудника, COUNT (идентификатор заказа) ИЗ заказы КУДА shippeddate НЕ ПУСТО ГРУППА ПО идентификатору сотрудника HAVING COUNT (orderid)> 100) bestsalesperson)
В этом руководстве мы показали вам, как использовать оператор SQL UPDATE для изменения данных в одной или нескольких строках таблицы.
Было ли это руководство полезным?
Как выполнить ОБНОВЛЕНИЕ из инструкции SELECT в SQL Server
В этой статье мы изучим различные методы, которые используются для обновления данных в таблице данными из других таблиц. Структура запроса UPDATE from SELECT является основным методом выполнения этих обновлений.
Запрос UPDATE используется для изменения существующей строки или строк в базе данных. Запросы UPDATE могут изменять все строки таблиц, или мы можем ограничить влияние оператора update для определенных строк с помощью предложения WHERE .В основном мы используем постоянные значения для изменения данных, например следующие структуры.
Оператор полного обновления используется для изменения всех данных таблицы с тем же значением.
Таблица ОБНОВЛЕНИЯ SET col1 = constant_value1, col2 = constant_value2, colN = constant_valueN |
Оператор условного обновления используется для изменения данных, которые удовлетворяют условию WHERE .
Таблица ОБНОВЛЕНИЯ SET col1 = constant_value1, col2 = constant_value2, colN = constant_valueN WHERE col = val |
Однако для разных сценариев нам не может хватить этого типа использования постоянного значения, и нам нужно использовать данные других таблиц, чтобы обновить нашу таблицу. Этот тип оператора обновления немного сложнее, чем обычные структуры.В следующих разделах мы узнаем, как написать этот тип запроса на обновление с помощью различных методов, но сначала мы должны подготовить наши образцы данных. Итак, давайте сделаем это.
Подготовка выборки данных
С помощью следующего запроса мы создадим таблицы Persons и AddressList и заполним их некоторыми синтетическими данными. Эти две таблицы связаны через столбец PersonId , что означает, что в этих двух таблицах значение столбца PersonId представляет одного и того же человека.
1 2 3 4 5 6 7 8 9 10 11 12 13 140002 18 19 20 21 22 23 24 25 26 27 28 29 30 000 000 34 35 36 37 38 | СОЗДАТЬ ТАБЛИЦУ dbo.Лица (PersonId INT PRIMARY KEY IDENTITY (1, 1) NOT NULL, PersonName VARCHAR (100) NULL, PersonLastName VARCHAR (100) NULL, PersonPostCode VARCHAR 9 (100) NULL) (100) NULL) GO CREATE TABLE AddressList ( [AddressId] [int] PRIMARY KEY IDENTITY (1,1) NOT NULL, [PersonId] [int] NULL, [ PostCode] [varchar] (100) NULL, [City] [varchar] (100) NULL) GO INSERT INTO Persons (PersonName, PersonLastName) VALUES (N0002 ) Salvador ', N'Williams'), (N'Lawrence ', N'Brown'), (N'Gilbert ', N'Jones'), (N'Ernest ', N'Smith') , (N'Jorge ', N'Johnson') GO INSERT INTO AddressList (PersonI d, PostCode, City) ЗНАЧЕНИЯ (1, N'07145 ', N'Philadelphia'), (2, N'68443 ', N'New York'), (3, N'50675 ', N'Phoenix'), (4, N'96573 ', N'Chicago') ВЫБРАТЬ * ИЗ ЛИЦ ВЫБРАТЬ * ИЗ AddressList |
ОБНОВЛЕНИЕ из SELECT: метод соединения
В этом методе обновляемая таблица будет объединена со справочной (вторичной) таблицей, содержащей новые значения строк.Таким образом, мы можем получить доступ к совпадающим данным справочной таблицы на основе указанного типа соединения. Наконец, обновляемые столбцы могут быть сопоставлены со столбцами, на которые имеются ссылки, и процесс обновления изменяет значения этих столбцов.
В следующем примере мы обновим данные столбцов PersonCityName и PersonPostCode с данными столбцов City и PostCode таблицы AdressList .
ОБНОВЛЕНИЕ Согласно НАБОР Per.PersonCityName = Addr.City, Per.PersonPostCode = Addr.PostCode FROM Persons Per INNER JOIN AddressList Addr ON Per.PersonId = Addr.PersonId |
После выполнения обновления из запроса выбора вывод таблицы Persons будет таким, как показано ниже;
Давайте попробуем разобраться в приведенном выше коде:
Мы ввели имя таблицы, которое будет обновлено после оператора UPDATE .После ключевого слова SET мы указали имена столбцов, которые нужно обновить, а также сопоставили их с указанными столбцами таблицы. После предложения FROM мы повторно ввели имя таблицы, которое будет обновлено. После предложения INNER JOIN мы указали указанную таблицу и присоединили ее к таблице для обновления. В дополнение к этому мы можем указать предложение WHERE и отфильтровать любые столбцы ссылочной или обновленной таблицы. Мы также можем переписать запрос, используя псевдонимы для таблиц.
ОБНОВЛЕНИЕ для НАБОР Per.PersonCityName = Addr.City, Per.PersonPostCode = Addr.PostCode FROM Persons Per INNER JOIN AddressPonIddon 9000.Idr. |
Совет по производительности:
Индексы - очень полезные объекты базы данных для повышения производительности запросов в SQL Server.В частности, если мы работаем над производительностью запроса на обновление, мы должны учитывать эту вероятность. Следующий план выполнения иллюстрирует план выполнения предыдущего запроса. Единственное отличие состоит в том, что этот запрос обновил 3 000 000 строк таблицы Persons . Этот запрос был выполнен за 68 секунд.
Мы добавили некластеризованный индекс в таблицу Persons перед обновлением, и добавленный индекс включает столбцы PersonCityName и PersonPostCode в качестве ключа индекса.
Следующий план выполнения демонстрирует план выполнения того же запроса, но этот запрос был выполнен в течение 130 секунд из-за добавленного индекса, в отличие от первого.
Операторы обновления индекса и сортировки потребляют 74% стоимости плана выполнения. Мы видели эту очевидную разницу в производительности одного и того же запроса из-за использования индекса в обновленных столбцах. В результате, если обновленные столбцы используются индексами, как, например, это, производительность запроса может отрицательно сказаться.В частности, мы должны учитывать эту проблему, если мы будем обновлять большое количество строк. Чтобы решить эту проблему, мы можем отключить или удалить индекс перед выполнением запроса на обновление.
С другой стороны, на операторе Sort , отображается предупреждающий знак, который указывает на то, что у этого оператора что-то идет не так. Когда мы наводим указатель мыши на этот оператор, мы можем видеть детали предупреждения.
Во время выполнения запроса оптимизатор запросов вычисляет необходимое потребление памяти для запроса на основе предполагаемых номеров строк и размера строки.Однако эта оценка потребления может быть неверной по разным причинам, и если запрос требует больше памяти, чем оценка, он использует данные tempdb. Этот механизм называется утечкой базы данных tempdb и приводит к потере производительности. Причина этого: память всегда быстрее, чем база данных tempdb, потому что база данных tempdb использует ресурсы диска.
Вы можете увидеть эту фантастическую статью SQL Server 2017: SQL Sort, Spill, Memory и Adaptive Memory Grant Feedback для получения дополнительных сведений о проблеме утечки tempdb.
ОБНОВЛЕНИЕ из SELECT: оператор MERGE
Оператор MERGE используется для управления (INSERT, UPDATE, DELETE) целевой таблицей путем ссылки на исходную таблицу для совпадающих и несовпадающих строк. Оператор MERGE может быть очень полезен для синхронизации таблицы из любой исходной таблицы.
Теперь, если мы вернемся к нашей позиции, оператор MERGE можно использовать в качестве альтернативного метода для обновления данных в таблице данными из другой таблицы.В этом методе справочную таблицу можно рассматривать как исходную таблицу, а целевую таблицу - это таблица, которая будет обновляться. Следующий запрос может быть примером этого метода использования.
MERGE Persons AS Per USING (SELECT * FROM AddressList) AS Addr ON Addr.PersonID = Per.PersonID КОГДА СОБИРАЕТСЯ ТОГДА НАБОР ОБНОВЛЕНИЙ Per.PersonPostCode = Per.PostCode = PersonCityName = Addr.City; ВЫБРАТЬ * ИЗ ЛИЦ |
Теперь давайте построчно займемся предыдущим обновлением в выбранном запросе.
Мы ввели таблицу Persons после оператора MERGE , потому что это наша целевая таблица, которую мы хотим обновить, и мы дали ей псевдоним Per , чтобы использовать остальную часть запроса.
ИСПОЛЬЗОВАНИЕ (ВЫБРАТЬ * ИЗ AddressList) AS Адрес |
После оператора USING мы указали исходную таблицу.
ON Addr.PersonID = Per.PersonID |
С помощью этого синтаксиса определяется условие соединения между целевой и исходной таблицами.
КОГДА СООТВЕТСТВУЕТ ТОГДА НАБОР ОБНОВЛЕНИЯ Per.PersonPostCode = Addr.PostCode; |
В этой последней строке запроса мы выбрали метод обработки совпадающих строк.Индивидуально для этого запроса мы выбрали метод UPDATE для сопоставленных строк целевой таблицы. Наконец, мы добавили знак точки с запятой (;), потому что операторы MERGE должны заканчиваться знаками точки с запятой.
ОБНОВЛЕНИЕ из SELECT: метод подзапроса
Подзапрос - это внутренний запрос, который можно использовать внутри операторов DML (SELECT, INSERT, UPDATE и DELETE). Основная характеристика подзапросов заключается в том, что они могут выполняться только с внешним запросом.
Метод подзапроса - это самый простой и простой метод обновления существующих данных из данных других таблиц. Заметная разница в этом методе заключается в том, что это может быть удобный способ обновить один столбец для таблиц с небольшим количеством строк. Теперь мы выполним следующий запрос, а затем проанализируем его.
ОБНОВЛЕНИЕ Персон НАБОР Persons.PersonCityName = (ВЫБРАТЬ AddressList.PostCode FROM AddressList ГДЕ AddressList.PersonId = Persons.PersonId) |
После выполнения обновления из оператора выбора вывод таблицы будет таким, как показано ниже;
Как мы видим, данные столбца PersonCityName таблицы Persons были обновлены данными столбца City таблицы AddressList для сопоставленных записей для столбца PersonId .Относительно этого метода следует выделить следующие важные моменты.
- Если подзапрос не смог найти ни одной совпадающей строки, обновленное значение будет изменено на NULL.
Если подзапрос находит несколько совпадающих строк, запрос на обновление вернет ошибку, как показано ниже:
- Часто метод обновления подзапроса может не обеспечивать удовлетворительную производительность.
Заключение
В этой статье мы научились обновлять данные в таблице данными, которые содержатся в других таблицах.Структура запроса « UPDATE from SELECT » может использоваться для выполнения этого типа сценария обновления данных. Также мы можем использовать альтернативные операторы MERGE и методы подзапроса.
Эсат Эркеч - специалист по SQL Server, который начал свою карьеру более 8 лет назад в качестве разработчика программного обеспечения. Он является сертифицированным экспертом по решениям Microsoft SQL Server.
Большую часть своей карьеры он посвятил администрированию и разработке баз данных SQL Server. В настоящее время он занимается администрированием баз данных и бизнес-аналитикой.Вы можете найти его в LinkedIn.
Посмотреть все сообщения от Esat Erkec
Последние сообщения от Esat Erkec (посмотреть все)
SQL Server: инструкция UPDATE
В этом руководстве по SQL Server объясняется, как использовать оператор UPDATE в SQL Server (Transact-SQL) с синтаксисом и примерами.
Описание
Оператор UPDATE SQL Server (Transact-SQL) используется для обновления существующих записей в таблице в базе данных SQL Server. Существует 3 синтаксиса для оператора UPDATE в зависимости от того, выполняете ли вы традиционное обновление или обновляете одну таблицу данными из другой таблицы.
Синтаксис
Синтаксис оператора UPDATE при обновлении одной таблицы в SQL Server (Transact-SQL):
Таблица ОБНОВЛЕНИЯ УСТАНОВИТЬ столбец1 = выражение1, столбец2 = выражение2, ... [ГДЕ условия];
ИЛИ
Синтаксис оператора UPDATE при обновлении одной таблицы данными из другой таблицы в SQL Server (Transact-SQL):
ОБНОВЛЕНИЕ table1 УСТАНОВИТЬ столбец1 = (ВЫБРАТЬ выражение1 ИЗ table2 ГДЕ условия) [ГДЕ условия];
ИЛИ
Синтаксис оператора UPDATE SQL Server при обновлении одной таблицы данными из другой таблицы:
ОБНОВЛЕНИЕ table1 УСТАНОВИТЬ table1.столбец = table2.expression1 ИЗ table1 INNER JOIN table2 ВКЛ (table1.column1 = table2.column1) [ГДЕ условия];
Параметры или аргументы
- столбец1, столбец2
- Столбцы, которые вы хотите обновить.
- выражение1, выражение2
- Новые значения для присвоения column1 , column2 . Таким образом, column1 будет присвоено значение expression1 , column2 будет присвоено значение expression2 и так далее.
- ГДЕ условия
- Необязательно. Условия, которые должны быть выполнены для выполнения обновления.
Пример - обновление одного столбца
Давайте посмотрим на очень простой пример запроса UPDATE SQL Server.
Например:
сотрудников UPDATE НАБОР last_name = 'Джонсон' ГДЕ employee_id = 10;
Этот пример ОБНОВЛЕНИЯ SQL Server обновит last_name до 'Johnson' в таблице employee , где employee_id равен 10.
Пример - обновление нескольких столбцов
Давайте рассмотрим пример SQL Server UPDATE, в котором вы можете обновить более одного столбца с помощью одного оператора UPDATE.
Например:
сотрудников UPDATE НАБОР first_name = 'Кайл', employee_id = 14 ГДЕ last_name = 'Джонсон';
Если вы хотите обновить несколько столбцов, вы можете сделать это, разделив пары столбец / значение запятыми.
Этот пример оператора UPDATE SQL Server обновит first_name до «Kyle» и employee_id до 14, где last_name - «Johnson».
Пример - обновление таблицы данными из другой таблицы
Давайте посмотрим на пример UPDATE, который показывает, как обновить таблицу данными из другой таблицы в MySQL.
Например:
ОБНОВЛЕНИЕ сотрудников
SET first_name = (ВЫБЕРИТЕ first_name
ИЗ контактов
WHERE contacts.last_name = employee.last_name)
WHERE employee_id> 95;
В этом примере UPDATE будет обновлена только таблица сотрудников для всех записей, в которых employee_id больше 95.Когда last_name из таблицы контактов совпадает с last_name из таблицы employee , first_name из таблицы contacts будет скопировано в поле first_name в таблице employee .
Вы можете переписать этот оператор UPDATE в SQL Server, используя второй синтаксис, чтобы обновить таблицу данными из другой таблицы.
Например:
сотрудников UPDATE НАБОР сотрудников.first_name = contacts.first_name ОТ сотрудников INNER JOIN контакты ВКЛ (employee.last_name = contacts.last_name) ГДЕ employee_id> 95;
В этом примере UPDATE будет выполнено то же обновление, что и в предыдущем.
ЗАПРОС ОБНОВЛЕНИЯ в SQL
Автор: Чайтанья Сингх | Подано: SQL
Запрос на обновление используется для обновления существующих строк (записей) в таблице. В последних нескольких руководствах мы увидели, как вставлять данные в таблицу с помощью запроса INSERT и как получать данные с помощью запроса SELECT и предложения Where.Что, если мы хотим обновить существующую запись? здесь появляется запрос на обновление. Используя это, мы можем обновить любое количество строк в таблице.
Синтаксис
ОБНОВЛЕНИЕ Имя таблицы SET имя_столбца1 = значение, имя_столбца2 = значение .... ГДЕ условие;
Query обновит только те строки, которые удовлетворяют условию, определенному в предложении where.
Пример
СОТРУДНИКОВ стол:
+ ------ + ---------- + --------- + ---------- + | SSN | EMP_NAME | EMP_AGE | EMP_SALARY | + ------ + ---------- + --------- + ---------- + | 101 | Стив | 23 | 9000.00 | | 223 | Питер | 24 | 2550.00 | | 388 | Шубхам | 19 | 2444.00 | | 499 | Чайтанья | 29 | 6588.00 | | 589 | Апурв | 21 | 1400.00 | | 689 | Раджат | 24 | 8900.00 | | 700 | Аджит | 20 | 18300.00 | + ------ + ---------- + --------- + ---------- +
Обновите зарплату сотрудников до 10000, если они старше 25 лет.
SQL> ОБНОВЛЕНИЕ СОТРУДНИКОВ УСТАНОВИТЬ EMP_SALARY = 10000 ГДЕ EMP_AGE> 25;
Обновленная таблица EMPLOYEES будет выглядеть так:
+ ------ + ---------- + --------- + ---------- + | SSN | EMP_NAME | EMP_AGE | EMP_SALARY | + ------ + ---------- + --------- + ---------- + | 101 | Стив | 23 | 9000.00 | | 223 | Питер | 24 | 2550.00 | | 388 | Шубхам | 19 | 2444.00 | | 499 | Чайтанья | 29 | 10000.00 | | 589 | Апурв | 21 | 1400.00 | | 689 | Раджат | 24 | 8900.00 | | 700 | Аджит | 20 | 18300.00 | + ------ + ---------- + --------- + ---------- +
Как видите, в таблице указан только один сотрудник старше 25 лет. Заработная плата для сотрудника обновлена до 10000.
Обновить зарплату сотрудника «Апурв» до 1 20000.
SQL> ОБНОВЛЕНИЕ СОТРУДНИКОВ УСТАНОВИТЬ EMP_SALARY = 120000 ГДЕ EMP_NAME = 'Apoorv';
Выход:
+ ------ + ---------- + --------- + ---------- + | SSN | EMP_NAME | EMP_AGE | EMP_SALARY | + ------ + ---------- + --------- + ---------- + | 101 | Стив | 23 | 9000.00 | | 223 | Питер | 24 | 2550.00 | | 388 | Шубхам | 19 | 2444.00 | | 499 | Чайтанья | 29 | 10000.00 | | 589 | Апурв | 21 | 12000.00 | | 689 | Раджат | 24 | 8900.00 | | 700 | Аджит | 20 | 18300.00 | + ------ + ---------- + --------- + ---------- +
MySQL запрос UPDATE с примером
Что такое запрос UPDATE?
UPDATE Команда MySQL используется для изменения строк в таблице. Команду обновления можно использовать для одновременного обновления одного или нескольких полей. Его также можно использовать для обновления таблицы MySQL значениями из другой таблицы.
Синтаксис команды обновления MySQL
Базовый синтаксис запроса на обновление в MySQL показан ниже.
ОБНОВЛЕНИЕ `table_name` SET` column_name` = `new_value '[WHERE condition];
ЗДЕСЬ
- UPDATE `table_name` - это команда, которая сообщает MySQL об обновлении данных в таблице.
- SET `имя_столбца` =` новое_значение '- это имена и значения полей, на которые будет воздействовать запрос на обновление. Обратите внимание: при установке значений обновления строковые типы данных должны быть заключены в одинарные кавычки. Числовые значения не нужно заключать в кавычки. Тип данных даты должен быть в одинарных кавычках и в формате «ГГГГ-ММ-ДД».
- [WHERE condition] является необязательным и может использоваться для установки фильтра, ограничивающего количество строк, затронутых запросом UPDATE MySQL.
Обновление в примере MySQL
Давайте теперь рассмотрим практический пример, который обновляет данные в таблице элементов. Предположим, что членские номера 1 и 2 нашего члена имеют следующие обновления, которые необходимо внести в их записи данных.
Членский номер | Требуются обновления |
1 | Изменен контактный номер с 999 на 0759 253532 |
2 | Измените имя на Джанет Смит Джонс, а физический адрес следует обновить на Мелроуз 123 |
Прежде чем вносить какие-либо обновления в наши данные, мы начнем с внесения обновлений для членского номера 1. Давайте извлечем запись для членского номера 1.Показанный ниже сценарий помогает нам в этом.
ВЫБРАТЬ * ИЗ `members` ГДЕ` members_number` = 1;
Выполнение вышеуказанного скрипта дает нам следующие результаты.
членский_номер | полные_имена | пол | дата_ рождения | физический_адрес | почтовый_адрес | contct_number | эл. 4 | Личная сумка | 999 | Этот адрес электронной почты защищен от спам-ботов.У вас должен быть включен JavaScript для просмотра. |
---|
Давайте теперь обновим контактный номер, используя сценарий, показанный ниже.
ОБНОВЛЕНИЕ `members` SET` contact_number` = '0759 253 542' ГДЕ `members_number` = 1;
Выполнение вышеуказанного сценария обновляет контактный номер с 999 до 0759 253 532 для членского номера 1. Давайте теперь посмотрим на запись для членского номера 1 после выполнения сценария обновления.
ВЫБРАТЬ * FROM `members` ГДЕ` members_number` = 1;
Выполнение вышеуказанного скрипта дает нам следующие результаты.
членский_номер | полные_имя | пол | дата_ рождения | физический_адрес | почтовый_адрес | contct_number | эл.почта |
---|---|---|---|---|---|---|---|
1 | Jones Январь4 | Личная сумка | 0759 253 542 | Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. |
Давайте теперь посмотрим на обновления, необходимые для членского номера 2.
членский_номер | полные_имена | пол | дата_ рождения | физический_адрес | 69 | почтовый_адрес | Smith Jones | Женский | 23-06-1980 | Park Street | NULL | NULL | Этот адрес электронной почты защищен от спам-ботов.У вас должен быть включен JavaScript для просмотра. |
---|
Следующий скрипт помогает нам в этом.
ОБНОВЛЕНИЕ `members` SET` full_names` = 'Janet Smith Jones', `physical_address` = 'Melrose 123' WHERE` members_number` = 2;
Выполнение вышеуказанного сценария обновляет полные имена для членского номера 2 на Джанет Смит Джонс и физический адрес на Мелроуз 123.
членский_номер | полные_имя | пол | дата_ рождения | физический_адрес | почтовый_адрес | контактный_номер | эл. | NULL | NULL | Этот адрес электронной почты защищен от спам-ботов.У вас должен быть включен JavaScript для просмотра. |
---|
Сводка
- Команда обновления используется для изменения существующих данных.
- «Предложение WHERE» используется для ограничения количества строк, затронутых запросом UPDATE.
Оператор SQL UPDATE (Transact SQL)
Используйте оператор SQL UPDATE для изменения данных в столбцах таблицы данных SQL Server. В этой статье давайте рассмотрим использование оператора UPDATE. Мы обсуждаем некоторые передовые практики, ограничения и подводим итоги на нескольких примерах.
Это третья статья в серии статей. Вы можете начать с самого начала, прочитав Введение в операторы изменения данных SQL Server.
Все примеры для этого урока основаны на Microsoft SQL Server Management Studio и базе данных AdventureWorks. Начните использовать эти бесплатные инструменты уже сегодня. Получить мое руководство Начало работы с SQL Server .
Прежде чем мы начнем
Хотя в этой статье в качестве примеров используется база данных AdventureWorks, я решил создать примерную таблицу для использования в базе данных, чтобы лучше проиллюстрировать примеры.Здесь вы можете найти скрипт, который вам понадобится для запуска.
Кроме того, давайте сначала заполним таблицу некоторыми данными, используя следующий оператор INSERT:
С topSalesPerson (FullName, SalesLastYear, City, rowguid) AS (ВЫБРАТЬ S.FirstName + '' + S.LastName, S.SalesLastYear, С.Сити,NEWID ()
ОТ Sales.vSalesPerson S ГДЕ S.SalesLastYear> 1000000)
ВСТАВИТЬ В esqlSalesPerson (FullName, SalesLastYear,Город, rowguid)
ВЫБЕРИТЕ FullName, Продажи в прошлом году, Город, rowguid ОТ topSalesPerson
Вы можете узнать больше об операторе INSERT, прочитав нашу статью Введение в оператор INSERT.
Базовая структура обновления SQL
Используйте оператор SQL UPDATE для изменения значений столбца. Хотя оператор обновления изменяет данные столбца из многих источников, такие как литеральные значения или другие результаты запроса, основной формат остается тем же.
Оператор UPDATE состоит из трех компонентов:
- Таблица, которую вы хотите изменить.
- Столбец, который нужно изменить.
- Исходные данные, которые вы хотите использовать для внесения изменений.
Общий формат оператора UPDATE:
ОБНОВЛЕНИЕ имя_таблицы
УСТАНОВИТЬ column1 = value1,
столбец2 = значение2,
…
Сейчас мы собираемся сделать несколько примеров обновлений, поэтому, если вы еще этого не сделали, запустите сценарий для создания таблицы esqlSalesPerson.
Примеры обновления SQL
Обновлена каждая строка в таблице
В этом примере мы вставляем одну строку в таблицу esqlSalesPerson. Вот его структура таблицы:
Предположим, мы хотим получить город на каждого продавца в Анн-Арборе. Команда для запуска:
ОБНОВЛЕНИЕ esqlSalesPerson
SET City = 'Ann Arbor'
Вы также можете обновлять более одного столбца за раз. Чтобы обновить как City, так и rowguid, мы можем запустить
ОБНОВЛЕНИЕ esqlSalesPerson
SET City = 'Анн-Арбор',
rowguid = NEWID ()
Что обновляет таблицу до следующего:
ОБНОВЛЕНИЕ esqlSalesPerson
НАБОР FullName = 'Дон Сакс'
ГДЕ SalesPersonID = 10027
Меняет имя Дональда Сакса на Дон Сакс.
Обратите внимание, что мы использовали первичный ключ SalesPersonID для фильтрации строки. Это позволяет очень легко гарантировать, что SQL UPDATE применяется к одной строке.
Примечание. Поскольку первичный ключ создается автоматически, не удивляйтесь, что ваши строки отличаются от приведенных в примерах.
Обновления SQL, влияющие на выбранные строки
Оператор UPDATE может обновлять более одной строки. Предложение WHERE управляет этим поведением. UPDATE влияет на все строки, возвращаемые с помощью предложения WHERE.
Предположим, что каждый продавец, чей ID меньше 10031, работал в Saline. Чтобы обновить строки, чтобы отразить это, мы могли бы использовать этот оператор UPDATE:
ОБНОВЛЕНИЕ esqlSalesPerson
SET City = 'Saline'
ГДЕ SalesPersonID <10031
, что приводит к модификации строки:
Обновить несколько столбцов
Для обновления нескольких столбцов используйте предложение SET, чтобы указать дополнительные столбцы. Как и в случае с отдельными столбцами, вы указываете столбец и его новое значение, а затем еще один набор столбцов и значений.В этом случае каждый столбец отделяется столбцом.
Здесь мы обновим имя и фамилию:
ОБНОВЛЕНИЕ Лицо.
Установите FirstName = 'Kenneth'
, LastName = 'Smith'
ГДЕ BusinessEntityID = 1
Вы можете добавить столько столбцов, сколько хотите, только не забудьте разделить их запятыми.
Будьте осторожны! Вы не можете легко «исправить» свои ошибки. Один трюк, который я делаю, чтобы упростить тестирование и изучение, - это «обернуть» мои операторы обновления в транзакцию, чтобы я мог опробовать их без постоянного изменения моей базы данных.
Вот тот же пример для обновления нескольких столбцов , но защищенного транзакцией…
НАЧАТЬ СДЕЛКУ
- Попробуйте обновить…
ОБНОВЛЕНИЕ Person.Person
Установите FirstName = 'Kenneth'
, LastName = 'Smith'
ГДЕ BusinessEntityID = 1
- Давайте посмотрим, что мы обновили
ВЫБРАТЬ * ОТ ЛИЦА.
ГДЕ BusinessEntityID = 1
-- Отменить изменения…
ОТКАТ
Использование объединений в обновлении SQL
В этом примере мы покажем вам, как обновить значения столбца на основе совпадения с другой таблицей.Для этого используйте соединение. Общая форма для использования:
ОБНОВЛЕНИЕ maintable УСТАНОВИТЬ columnToUpdate = secondtable.columnValue ИЗ основного стола ВНУТРЕННИЙ ПРИСОЕДИНЯЙТЕСЬ второй стол ON условие соединения
Где основная таблица - это таблица, которую вы хотите обновить, а вторая таблица содержит значения обновления; мы используем объединения для сопоставления.
Предположим, что кто-то случайно обновил все значения столбца esqlSalesPerson.City до NULL!
Как мы можем легко повторно заполнить эти данные, не вводя их повторно?
Зная, что esqlSalesPerson изначально был заполнен информацией из отдела продаж, мы используем знания для настройки запроса, который перекачивает данные из vSalesPerson в esqlSalesPerson.Это возможно, поскольку полное имя продавца является общим для обеих таблиц.
На диаграмме ниже вы увидите, где есть совпадения между этими двумя таблицами:
Сопоставляя esqlSalesPerson.FullName с vSalesPerson, мы можем обновить esqlSalesPerson.City с соответствующей записью.
Прежде чем мы пойдем дальше, давайте сначала удалим значения столбца city. Для этого вы можете выполнить следующее, а затем убедиться, что все города имеют значение NULL.
- Заглушить город ОБНОВЛЕНИЕ esqlSalesPerson SET City = Null; -- Доказательство ВЫБЕРИТЕ SalesPersonID, Город ОТ esqlSalesPerson
Как только это будет завершено, мы можем приступить к обновлению города со значением соответствия, используя этот оператор UPDATE:
ОБНОВЛЕНИЕ esqlSalesPerson УСТАНОВИТЬ Город = v.Город ОТ esqlSalesPerson ВНУТРЕННИЕ ПРИСОЕДИНЯЙТЕСЬ к Sales.vSalesPerson v НА e.FullName = v.FirstName + '' + v.LastName
Как только вы посмотрите на инструкцию, вы увидите, что мы добавили предложения FROM и INNER JOIN.
Напомним, что предложение INNER JOIN используется для сопоставления строк из одной таблицы с другой с использованием условия соединения.
В нашем случае условием соединения является e.FullName = v.FirstName + ‘‘ + v.LastName. Обратите внимание, что здесь мы создаем полное имя из столбцов представления FirstName и LastName.Это круто, и это работает!
Итак, когда у нас есть соединение, последняя часть бизнеса делает обновление. Мы просто устанавливаем City равным его аналогу v.City, и все в порядке.
Журнал изменений с использованием предложения OUTPUT
Предложение OUTPUT регистрирует изменения, внесенные в строки, затронутые оператором UPDATE.
Предположим, что показатели SalesLastYear оказались неверными и их необходимо скорректировать на пять процентов. Вы можете легко настроить значения, используя следующую инструкцию:
ОБНОВЛЕНИЕ esqlSalesPerson УСТАНОВИТЬ SalesLastYear = SalesLastYear * 1.05
Однако предположим, что отдел продаж хочет регистрировать все изменения. Конечно, вы можете запустить запрос перед обновлением, один после обновления, а затем сравнить, но вместо того, чтобы делать все это, мы можем использовать предложение OUTPUT для записи изменений непосредственно в таблицу.
Полный сценарий для запуска записи вывода во временную таблицу:
DECLARE @UpdateLog table ( SalesPersonID int NOT NULL, OldSalesLastYear int, NewSalesLastYear int) ОБНОВЛЕНИЕ esqlSalesPerson УСТАНОВИТЬ SalesLastYear = SalesLastYear * 1.05 ВЫВОД вставлен. SalePersonID, удалено.SalesLastYear, вставлен.SalesLastYear В @UpdateLog ВЫБЕРИТЕ SalesPersonID, OldSalesLastYear, НовыеПродажиПоследнийГод ОТ @UpdateLog
Мы не будем говорить о трех частях по очереди.
Обратите внимание, что мы объявляем табличную переменную для хранения регистрируемых результатов. Мы делаем это с помощью следующей команды в нашем скрипте:
DECLARE @UpdateLog table ( SalesPersonID int NOT NULL, OldSalesLastYear int, NewSalesLastYear int)
Этот оператор определяет таблицу с тремя столбцами и называет табличную переменную @UpdateLog.Причина, по которой мы используем табличную переменную, является временной и будет удалена после закрытия сеанса запроса.
Определив табличную переменную, мы можем безопасно записывать результаты с помощью OUTPUT, как здесь:
ОБНОВЛЕНИЕ esqlSalesPerson УСТАНОВИТЬ SalesLastYear = SalesLastYear * 1.05 ВЫВОД вставлен. SalePersonID, удалено.SalesLastYear, вставлен.SalesLastYear INTO @UpdateLog
По мере обновления каждой строки специальные значения префикса столбца удалено и вставлено предоставляют средства для просмотра значения до и после обновления соответственно.
Старая продажная стоимость существует в deleted.SalesLastYear; тогда как вставленный.SalesLastYear содержит недавно обновленное значение.
Для просмотра зарегистрированных значений вы можете запустить следующее:
ВЫБЕРИТЕ SalesPersonID, OldSalesLastYear, НовыеПродажиПоследнийГод ОТ @UpdateLog
Что отображает:
Примечание. Если вам нравится предложение OUTPUT, помните, что вы также можете использовать его с INSERT, DELETE и MERGE!
Рекомендации по использованию оператора SQL UPDATE
Оператор UPDATE сложен и требует учета множества элементов.
Вот некоторые из наиболее важных. Полный список можно найти в статье UPDATE (Transact-SQL).
Рекомендации по типу данных (заполнение)
Имейте в виду, что при обновлении данных в столбцах с типом данных CHAR, VARCHAR или VARBINARY заполнение или усечение данных зависит от параметра SET ANSI_PADDING.
Когда SET ANSI_PADDING OFF, тогда типы данных CHAR дополняются пробелами, типы данных VARCHAR удаляют конечные пробелы, а VARBINARY удаляют конечные нули.
Например, если поле определено как CHAR (10) и вы обновляете значение «Kris» в этом столбце, то оно будет заполнено шестью пробелами. Значение изменено на «Крис»
.
Оператор SQL UPDATE Обработка ошибок
Вы можете обрабатывать ошибки при выполнении оператора UPDATE с помощью конструкции TRY… CATCH.
Есть несколько распространенных причин, по которым оператор UPDATE может не работать. Вот некоторые из наиболее распространенных:
- Нарушение уникального ключа - вы пытаетесь обновить значение, которое приводит к дублированию значения ключа.
- Преобразование типа данных - Вы пытаетесь обновить значение, которое не может быть правильно преобразовано в соответствующий тип данных столбца.
В этих случаях выполнение оператора UPDATE останавливается и UPDATE генерирует ошибку. Никакие строки из оператора UPDATE не сохраняются в таблице, даже те строки, которые не генерировали ошибку.
Это поведение «все или ничего» можно изменить для устранения арифметических ошибок. Рассмотрим деление на нулевую ошибку.
ОБНОВЛЕНИЕ myNumbers УСТАНОВИТЬ X = 10/0
Выдает ошибку, если для SET ARITHABORT установлено значение ON.В этом случае вставка останавливается, строки не обновляются и выдается ошибка.
Поведение блокировки инструкции SQL UPDATE
Исключительная (X) блокировка всегда ставится на таблицу при запуске обновления. Блокировка сохраняется до завершения оператора обновления. Поскольку это исключительная блокировка, никакая другая транзакция не может изменять данные в этой таблице, пока не будет завершена та, которая изначально установила блокировку.
.