Содержание

Оператор SQL UPDATE: примеры, синтаксис

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

Оператор SQL UPDATE имеет следующий синтаксис:

UPDATE table_name SET expression [WHERE condition]

Напоминаю, что записи в квадратных скобках [] являются необязательными.

После ключевого слова SET должен идти список столбцов таблицы, которые следует изменить, и новые значения в формате Имя_столбца = значение.

Дополнительное условие, описываемое в операторе SQL WHERE, помогает более гибко совершать манипуляции данными.


Примеры оператора SQL UPDATEИмеется следующая таблица Planets:

IDPlanetName
RadiusSunSeasonOpeningYearHavingRingsOpener
1Mars33966871659NoChristiaan Huygens
2Saturn6026810759. 22Yes
3Neptune24764601901846YesJohn Couch Adams
4
Mercury
2439115.881631NoNicolaus Copernicus
5Venus60512431610NoGalileo 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

Результат:

IDPlanetNameRadiusSunSeasonOpeningYearHavingRingsOpener
3Pluton24764601901846YesJohn 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

Результат:

IDPlanetNameRadiusSunSeason
OpeningYear
HavingRingsOpener
NULLMars33966871659NoChristiaan Huygens
NULLSaturn6026810759.22No
NULLNeptune24764601901846NoJohn Couch Adams

11 основных примеров команды UPDATE в MySQL

Одной из наиболее распространенных операций в MySQL является изменение существующего значения записи в таблице.

В этой статье мы расскажем, как использовать команду UPDATE в MySQL вместе с некоторыми полезными примерами.

Рассматриваются в данном руководстве следующие примеры:

  1. Обновление всех строк
  2. Обновление только выбранных строк
  3. Обновление значение столбца с выражением
  4. Использование ключевого слова DEFAULT в Update
  5. Обновление нескольких столбцов
  6. Используя условие LIMIT в обновлении
  7. Множественное обновление таблиц (с помощью Inner Join)
  8. Множественное обновление таблиц (с помощью Left Join)
  9. Возврат обновленного значения (или Pre-Update Value)
  10. Случай объединения или IF с Update
  11. Зачем использовать 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.

Предложение FOR UPDATE: Примеры | ora-sql.ru

  • Строки из обоих таблиц EMPLOYEES и DEPARTMENTS блокируются.

  • Используйте FOR UPDATE OF column_name, чтобы квалифицировать столбец, который Вы намереваетесь изменить, тогда только строки из этой определенной таблицы блокируются.

В примере на рисунке оператор FOR UPDATE блокирует строки таблицы EMPLOYEES с JOB_ID установленным в ST_CLERK и LOCATION_ID установленным в 1500, и блокирует строки таблицы DEPARTMENTS с отделами, у которых LOCATION_ID установлен в 1500.

Можно использовать FOR UPDATE OF column_name, чтобы квалифицировать столбец, который Вы намереваетесь изменить.

Список OF предложения FOR UPDATE не ограничивает Вас изменением только столбцов выбранных строк. Блокировки все еще устанавливаются на все строки; если Вы просто указываете FOR UPDATE в запросе и не включаете один или более столбцов после ключевого слова OF, база данных заблокирует все идентифицированные строки для всех таблиц, перечисленных в предложении FROM.

Следующий оператор блокирует только те строки в таблице EMPLOYEES с ST_CLERK, которые расположены в LOCATION_ID 1500. Никакие строки не блокируются таблице DEPARTMENTS:

    SELECT e.employee_id, e.salary, e.commission_pct
FROM employees e JOIN departments d
USING (department_id)
WHERE job_id = 'ST_CLERK' AND location_id = 1500
FOR UPDATE OF e. salary
ORDER BY e.employee_id;

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

    SELECT employee_id, salary, commission_pct, job_id
FROM employees
WHERE job_id = 'SA_REP'
FOR UPDATE WAIT 5
ORDER BY employee_id;

Далее: Создание и Удаление Синонимов

SQL Update с Case, либо назначать, либо ничего не делать



Исходя из этого вопроса здесь, есть ли способ поместить утверждение CASE в SQL UPDATE , которое либо обновляет, либо ничего не делает. В настоящее время у меня есть следующее:

UPDATE CustomerAddress
SET IsPrimaryAddress = CASE WHEN c2.IsPrimaryAddress=1 THEN 1 ELSE 0 END
FROM CustomerAddress
join #AddressToDeleteMasterOfLesserId p1 on CustomerAddress. Id=p1.[Id that is master]
join CustomerAddress c2 on p1.[Id to delete]=c2.Id 

Проблема возникает на этой линии:

SET IsPrimaryAddress = CASE WHEN c2.IsPrimaryAddress=1 THEN 1 ELSE **0** END

Когда я устанавливаю его на 0 в противном случае. Обновление должно проверить первое условие, и если это так, установите значение 1, но, если условие не выполняется, я не хочу устанавливать значение 0, мне нужно сохранить исходное значение.

SET IsPrimaryAddress = CASE WHEN c2.IsPrimaryAddress=1 THEN 1 ELSE *CustomerAddress.IsPrimary* END

Однако это не работает, потому что он получает значение из инструкции FROM , а не то значение, которое было установлено в данный момент. То, что я хочу, это что-то вроде этого

SET IsPrimaryAddress = CASE WHEN c2.IsPrimaryAddress=1 THEN 1 ELSE *Do nothing* END

Но это все равно задание, и он пытается установить значение NULL .

Возможно ли это выше?

UPDATE:

Выборочные данные:

пара ID-х, которые представляют адрес как таковой

ID to keep  ID to delete
------------------------
10          21
10          22
11          31
12          41

Я сосредоточусь на том, что происходит с 10. Так что 10 имеет IsPrimaryAddress=0 , в 21 IsPrimaryAddress=1 , и 22 имеет IsPrimaryAddress=0 .

Я верю, что происходит вот что (в псевдокоде):

Набор IsPrimaryAddress = если 21.IsPrimaryAddress=1 затем 21.IsPrimaryAddress еще набор для 10.IsPrimaryAddress

Итак, мы установили 10.IsPrimaryAddress на 1. Сейчас:

Набор IsPrimaryAddress = если 22.IsPrimaryAddress=1 затем 22.IsPrimaryAddress еще набор для 10.IsPrimaryAddress

Что, как я надеюсь, 10.IsPrimaryAddress равно 1. Но он, похоже, получил исходное значение, которое было 0, и теперь обновление было потеряно.

sql sql-server-2008 sql-update
Поделиться Источник dann. dev     21 марта 2012 в 21:03

3 ответа


  • SQL Инструкция Update Ничего Не Делает

    У меня есть оператор SQL Update , который при запуске в VS2010 через новое окно запроса работает, но когда я структурирую его как оператор обновления, ничего не происходит. Мне было интересно, может ли кто-то увидеть, что я делаю не так? Как я уже сказал, код работает при выполнении через окно…

  • Как ничего не делать в операторе SQL case?

    Мне нужно обновить столбец условно и в некоторых случаях не обновлять его вообще. это лучший способ, который я могу придумать, чтобы сделать это, но кажется, что это может быть неэффективно в ELSE, поскольку он все еще обновляет столбец с текущим значением столбца. Есть ли лучший способ, в котором…



6

SET CustomerAddress.IsPrimaryAddress = 
      CASE 
         WHEN c2. IsPrimaryAddress=1 
         THEN 1 
         ELSE CustomerAddress.IsPrimaryAddress 
      END

PS: я не уверен насчет имени таблицы, но идея заключается в том, чтобы вернуть само значение столбца, чтобы оставить его неизменным, это обычная практика.

Поделиться sll     21 марта 2012 в 21:06



3

Просто добавьте предложение WHERE, чтобы обновить только те строки, которые нуждаются в обновлении:

UPDATE CustomerAddress c1
  INNER JOIN #AddressToDeleteMasterOfLesserId p1 ON c1.Id = p1.[Id that is master]
  INNER JOIN CustomerAddress c2 ON p1.[Id to delete] = c2.Id
  SET c1.IsPrimaryAddress = 1
  WHERE c2.IsPrimaryAddress = 1

Поделиться Neil     21 марта 2012 в 21:15



1

UPDATE c
SET IsPrimaryAddress = CASE 
  WHEN c2. IsPrimaryAddress = 1 THEN 1 
  ELSE c.IsPrimaryAddress
END
FROM dbo.CustomerAddress AS c
INNER JOIN #AddressToDeleteMasterOfLesserId AS p1 
  ON c.Id = p1.[Id that is master]
INNER JOIN dbo.CustomerAddress AS c2 
  ON p1.[Id to delete] = c2.Id;

Поделиться Aaron Bertrand     21 марта 2012 в 21:05


  • T-SQL update с оператором switch-case

    Я хочу реализовать этот псевдокод в t-sql UPDATE Resources SET [Path]= CASE ([Path].Substring([Path].LastIndexOf(‘.’))) WHEN ‘.jpg’ THEN ‘/image.jpg’ WHEN ‘.png’ THEN ‘/image.jpg’ WHEN ‘.avi’ THEN ‘/video.jpg’ WHEN ‘.mkv’ THEN ‘/video.jpg’ для этого я использую это решение UPDATE Resources SET…

  • Использование оператора Case либо для Insert в таблицу, либо для обновления существующей строки

    Возможный Дубликат : Решения для INSERT или обновления на сервере SQL Только вставка строки, если it’s еще не существует Мой титул в значительной степени объясняет то, что я пытаюсь сделать, но я расскажу немного подробнее. Я создаю хранимую процедуру, когда она вызывается, сначала проверяет,…


Похожие вопросы:


jQuery найти элемент еще ничего не делать?

Я пытаюсь использовать jQuery , чтобы в основном обернуть кучу модификаций CSS через jQuery, но на страницах, где IDs или Classes не существует, я получаю ошибки ? Нравится…


Иначе ничего не делать SQL запрос

У меня есть поле, froiexported , в DB таблице claim3 , который либо установлен в один или ноль. Я хочу запустить обновление, где, если критерии в операторе case выполнены, значение в froiexported…


SQL Update с CASE заявление

Я собираюсь использовать примеры таблиц. tblAnimal: ——————————— |Animal | Colour | Gender | ——————————— |Dog | | | ———————————…


SQL Инструкция Update Ничего Не Делает

У меня есть оператор SQL Update , который при запуске в VS2010 через новое окно запроса работает, но когда я структурирую его как оператор обновления, ничего не происходит. Мне было интересно, может…


Как ничего не делать в операторе SQL case?

Мне нужно обновить столбец условно и в некоторых случаях не обновлять его вообще. это лучший способ, который я могу придумать, чтобы сделать это, но кажется, что это может быть неэффективно в ELSE,…


T-SQL update с оператором switch-case

Я хочу реализовать этот псевдокод в t-sql UPDATE Resources SET [Path]= CASE ([Path].Substring([Path].LastIndexOf(‘.’))) WHEN ‘.jpg’ THEN ‘/image.jpg’ WHEN ‘.png’ THEN ‘/image.jpg’ WHEN ‘.avi’ THEN…


Использование оператора Case либо для Insert в таблицу, либо для обновления существующей строки

Возможный Дубликат : Решения для INSERT или обновления на сервере SQL Только вставка строки, если it’s еще не существует Мой титул в значительной степени объясняет то, что я пытаюсь сделать, но…


SQL Update с CASE

не могли бы вы помочь мне с этим SQL? UPDATE VERSION SET VERSION_STATUS_ID = IF((SELECT COUNT(*) from VERSION where KEY = ‘ABC’) > 1, 5, 6) WHERE VERSION_ID = 1; Отчет об ошибке — SQL ошибка:. ..


SQL триггер UPDATE, вставить предложение Case

Каков правильный синтаксис для создания триггера SQL, который обновляет другую таблицу обновленные или вставленные значения AND поле, чтобы указать, было ли это UPDATE или INSERT. Пример того, что я…


Postgres: использование в конфликте вместе с CASE

Я пытаюсь определить точный синтаксис, который я должен использовать для выполнения on Conflict вместе с CASE. У меня есть таблица (игнорировать id , здесь это не актуально): CREATE TABLE…

Команда 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, то все записи таблицы будут обновлены без исключений.

Как я могу сделать оператор UPDATE с JOIN в SQL Server?

Вы получите наилучшую производительность, если забудете предложение where и поместите все условия в выражение ON.

Я думаю, это потому, что запрос сначала должен объединить таблицы, а затем выполнить предложение where, поэтому, если вы можете уменьшить то, что требуется для объединения, это быстрый способ получить результаты / выполнить обновление.

пример

сценарий

У вас есть таблица пользователей. Они могут войти в систему, используя свое имя пользователя или адрес электронной почты или account_number. Эти учетные записи могут быть активными (1) или неактивными (0). Эта таблица имеет 50000 строк

Затем у вас есть таблица пользователей, которую нужно отключить за один раз, потому что вы обнаружите, что они все сделали что-то плохое. Эта таблица, однако, имеет один столбец со смешанными именами пользователей, адресами электронной почты и номерами счетов. Он также имеет индикатор has_run, который должен быть установлен в 1 (true), когда он был запущен

запрос

UPDATE users User
    INNER JOIN
        blacklist_users BlacklistUser
        ON
        (
            User.username = BlacklistUser.account_ref
            OR
            User.email = BlacklistedUser.account_ref
            OR
            User.phone_number = BlacklistUser.account_ref
            AND
            User.is_active = 1
            AND
            BlacklistUser.has_run = 0
        )
    SET
        User.is_active = 0,
        BlacklistUser.has_run = 1;

аргументация

Если бы нам пришлось присоединиться только к условиям ИЛИ, по сути, нужно было бы проверить каждую строку 4 раза, чтобы увидеть, должно ли оно присоединиться, и потенциально вернуть намного больше строк. Однако, предоставляя ему больше условий, он может «пропустить» много строк, если они не удовлетворяют всем условиям при соединении.

бонус

Это более читабельно. Все условия находятся в одном месте, а строки для обновления — в одном месте

Руководство по SQL. Изменение данных. – PROSELYTE

Для изменения уже существующих данных мы используем SQL запрос UPDATE.
Для того, чтобы указать, какие именно данные необходимо изменить, мы должны использовать условный оператор WHERE.

Данный запрос имеет следующий вид:


UPDATE имя_таблицы
SET колонка1 = значение1, колонка2 = значение2, колонкаN = значениеN
WHERE [условие1];


Мы также можем использовать операторы AND/OR для уточнения условий.

Пример:

Предположим, что у нас есть таблица developers, которая содержит следующие данные:


+----+-------------------+------------+------------+--------+
| ID | NAME              | SPECIALTY  | EXPERIENCE | SALARY |
+----+-------------------+------------+------------+--------+
|  1 | Eugene Suleimanov | Java       |          2 |   2000 |
|  2 | Peter Romanenko   | Java       |          3 |   3500 |
|  3 | Andrei Komarov    | JavaScript |          2 |   2100 |
|  4 | Konstantin Geiko  | C#         |          2 |   2000 |
|  5 | Asya Suleimanova  | UI/UX      |          2 |   1800 |
+----+-------------------+------------+------------+--------+


Допустим, что нам необходимо изменить зарплату разработчика с именем Eugene Suleimanov. Для этого мы должны использовать следующую команду:


mysql> UPDATE developers 
SET SALARY = 2500 
WHERE NAME LIKE 'Eugene Suleimanov';


В результате наша запись будет изменена и наша таблица будет содержать уже такие данные:


+----+-------------------+------------+------------+--------+
| ID | NAME              | SPECIALTY  | EXPERIENCE | SALARY |
+----+-------------------+------------+------------+--------+
|  1 | Eugene Suleimanov | Java       |          2 |   2500 |
|  2 | Peter Romanenko   | Java       |          3 |   3500 |
|  3 | Andrei Komarov    | JavaScript |          2 |   2100 |
|  4 | Konstantin Geiko  | C#         |          2 |   2000 |
|  5 | Asya Suleimanova  | UI/UX      |          2 |   1800 |
+----+-------------------+------------+------------+--------+


Если мы хотим изменить несколько полей, например, опыт и зарплату, то наш запрос будет иметь следующий вид:


mysql> UPDATE developers 
SET EXPERIENCE = 3, SALARY = 2500 
WHERE NAME LIKE 'Andrei Komarov';


В результате выполнения данного запроса, наша таблица developers будет иметь следующий вид:


+----+-------------------+------------+------------+--------+
| ID | NAME              | SPECIALTY  | EXPERIENCE | SALARY |
+----+-------------------+------------+------------+--------+
|  1 | Eugene Suleimanov | Java       |          2 |   2500 |
|  2 | Peter Romanenko   | Java       |          3 |   3500 |
|  3 | Andrei Komarov    | JavaScript |          3 |   2500 |
|  4 | Konstantin Geiko  | C#         |          2 |   2000 |
|  5 | Asya Suleimanova  | UI/UX      |          2 |   1800 |
+----+-------------------+------------+------------+--------+


На этом мы заканчиваем изучение способов изменения существующих данных.
В следующей статье мы рассмотрим процесс удаления записей.

11 основных примеров команды ОБНОВЛЕНИЕ в MySQL

Одной из наиболее распространенных операций в MySQL является изменение текущего значения записи в таблице.

В этой статье мы расскажем, как использовать команду UPDATE в MySQL вместе с некоторыми полезными примерами.

Рассматриваются в следующую следующие примеры:

  1. Обновление всех строк
  2. Обновление только выбранных строк
  3. Обновление значения столбца с выражением
  4. Использование ключевого слова ПО УМОЛЧАНИЮ в обновлении
  5. Обновление нескольких столбцов
  6. Используя условие LIMIT в обновлении
  7. Множественное обновление таблиц (с помощью Inner Join )
  8. Множественное обновление таблиц (с помощью Left Join )
  9. Возврат обновленного значения (или значение до обновления)
  10. Случай объединения или IF с Update
  11. Зачем использовать ЗАКАЗАТЬ с обновлением?

Для этого урока мы будем использовать следующую таблицу в качестве примера. Это структура таблицы для примера.

 mysql> DESC worker;
+ -------- + ------------- + ------ + ----- + --------- + --- ------------- +
| Поле | Тип | Null | Ключ | По умолчанию | Экстра |
+ -------- + ------------- + ------ + ----- + --------- + --- ------------- +
| id | int (11) | НЕТ | PRI | NULL | auto_increment |
| имя | варчар (20) | ДА | | NULL | |
| отдел | варчар (10) | ДА | | Продажи | |
| зарплата | int (10) | ДА | | NULL | |
+ -------- + ------------- + ------ + ----- + --------- + --- ------------- + 

В настоящее время таблица worker имеет следующие записи.

 mysql> SELECT * FROM worker;
+ ----- + -------- + ------------ + -------- +
| id | имя | отдел | зарплата |
+ ----- + -------- + ------------ + -------- +
| 100 | Андрей | Продажи | 5000 |
| 200 | Антон | IT | 5500 |
| 300 | Максим | IT | 7000 |
| 400 | Димон | Маркетинг | 9500 |
| 500 | Антон | IT | 6000 |
| 501 | Анна | Бухгалтерский учет | NULL |
+ ----- + -------- + ------------ + -------- + 

Если вы новичок в MySQL, вероятно, вы должны сначала понять основы MySQL, включая, как базу данных MySQL.

1. Обновление всех строк

В следующем простом примере команда UPDATE будет установлено значение столбца DEPT для всех строк в таблице worker.

 mysql> ОБНОВЛЕНИЕ worker SET dept = 'IT';
Запрос в порядке, затронуты 3 строки (0,02 сек)
Совпало рядов: 6 Изменено: 3 Предупреждения: 0 

Вывод команды UPDATE будет иметь следующие две строки:

  • Строка 1: «Запрос выполнен», если запрос был выполнен. Если есть ошибка синтаксиса, он будет отображать его здесь.Даже если она не обновляла какие-либо записи, эта строка будет по-прежнему говорить «Query OK», пока не было никаких ошибок синтаксиса и утверждение было чистым. Эта линия также покажет, сколько записей было обновлено по этому запросу (например: затронуты 3 строки). И, наконец, это также покажет, сколько времени потребовалось для MySQL для выполнения запроса (например: 0,02 секунды).
  • Строка 2: Скажет, сколько записей, согласованы условием утверждения обновлений. В этом примере нет условия WHERE, нет ограничений на количество записей, которые следует учитывать для обновлений (так, он говорит: Соответствует рядов: 6). Далее, покажет, сколько записей действительно были обновлены (например: Изменено: 3). Наконец, он покажет, как много предупреждений там, во время обновления. Довольно много случаев, вы видите как 0, когда все работало правильно.

Вот обновленные записи после указанной команды UPDATE.

 mysql> SELECT * FROM worker;
+ ----- + -------- + ------------ + -------- +
| id | имя | отдел | зарплата |
+ ----- + -------- + ------------ + -------- +
| 100 | Андрей | IT | 5000 |
| 200 | Антон | IT | 5500 |
| 300 | Максим | IT | 7000 |
| 400 | Димон | IT | 9500 |
| 500 | Антон | IT | 6000 |
| 501 | Анна | IT | NULL |
+ ----- + -------- + ------------ + -------- + 

2.Обновление только выбранных строк

Вместо того, чтобы обновить все записи, вы можете выбрать высококачественную запись на основе условий WHERE.

В следующем примере будет обновлять таблицу сотрудников и назначить сотрудников, которые имеют зарплату или равно 7000 для отдела маркетинга.

 mysql> UPDATE worker SET dept = 'Marketing' ГДЕ зарплата> = 7000;
Запрос в порядке, затронуты 2 строки (0,01 сек)
Совпало рядов: 2 Изменено: 2 Предупреждения: 0 

Были только две записи, которые соответствовали выше, таблица обновилась, как показано ниже.

 mysql> SELECT * FROM worker;
+ ----- + -------- + ------------ + -------- +
| id | имя | отдел | зарплата |
+ ----- + -------- + ------------ + -------- +
| 100 | Андрей | IT | 5000 |
| 200 | Антон | IT | 5500 |
| 300 | Максим | Маркетинг | 7000 |
| 400 | Димон | Маркетинг | 9500 |
| 500 | Антон | IT | 6000 |
| 501 | Анна | IT | NULL |
+ ----- + -------- + ------------ + -------- + 

Мы обсуждали много различных практических условий WHERE в нашем учебнике MySQL по команде SELECT.Это очень полезно, чтобы понять, как использовать предложение ГДЕ эффективно во время ОБНОВЛЕНИЕ: 25 основных примеров в MySQL для команды SELECT.

3. Обновление значений столбца с выражением

При присвоении значения в столбце после SET, вы всегда должны указывать статические значения. Вы также можете использовать выражения, как показано ниже.

представляет собой размер заработной платы на 500 для всех сотрудников отдела ИТ.

 mysql> UPDATE worker SET зарплата = зарплата + 500 WHERE dept = 'IT';
Запрос в порядке, затронуты 3 строки (0,01 сек)
Совпало рядов: 4 Изменено: 3 предупреждений: 0 

Были только 4 записи, которые соответствовали условию выше. Только три записи были обновлены, как показано ниже, в одном из записей сотрудников, который принадлежит к техническому отделу, имеет нулевое значение в поле заработной платы. Таким образом, зарплата выше + 500 выражается по-прежнему NULL, и не обновляется эта конкретная запись.

 mysql> SELECT * FROM worker;
+ ----- + -------- + ------------ + -------- +
| id | имя | отдел | зарплата |
+ ----- + -------- + ------------ + -------- +
| 100 | Андрей | IT | 5500 |
| 200 | Антон | IT | 6000 |
| 300 | Максим | Маркетинг | 7000 |
| 400 | Димон | Маркетинг | 9500 |
| 500 | Антон | IT | 6500 |
| 501 | Анна | IT | NULL |
+ ----- + -------- + ------------ + -------- + 

4. Использование ключевого слова DEFAULT в обновлении

Вместо того, чтобы указать статическое значение или выражение, вы также можете использовать значение «DEFAULT», когда вы присваиваете значение столбца после SET.

Если вы посмотрите на вывод «DESC работник», показанного ниже, вы увидите, что столбец с именем по умолчанию. Как вы видите там, зарплата имеет значение по умолчанию NULL. Отдел имеет значение по умолчанию продаж.

 mysql> DESC worker;
+ -------- + ------------- + ------ + ----- + --------- + --- ------------- +
| Поле | Тип | Null | Ключ | По умолчанию | Экстра |
+ -------- + ------------- + ------ + ----- + --------- + --- ------------- +
| id | int (11) | НЕТ | PRI | NULL | auto_increment |
| имя | варчар (20) | ДА | | NULL | |
| отдел | варчар (10) | ДА | | Продажи | |
| зарплата | int (10) | ДА | | NULL | |
+ -------- + ------------- + ------ + ----- + --------- + --- ------------- + 

Во-первых, давайте обновим столбец зарплаты по умолчанию, используя ПО УМОЛЧАНИЮ, как показано слово ниже.

 mysql> UPDATE worker SET salary = DEFAULT;
Запрос в порядке, затронуты 5 строк (0,03 сек)
Совпало рядов: 6 Изменено: 5 предупреждений: 0 

Затем обновите столбец отдела до значений по умолчанию, используя слово ПО УМОЛЧАНИЮ, как показано ниже.

 mysql> UPDATE worker SET dept = DEFAULT;
Запрос в порядке, затронуты 6 строк (0,00 сек)
Совпало рядов: 6 Изменено: 6 Предупреждений: 0 

Как видно из следующих выходных данных, мы можем видеть, что по умолчанию использовались соответствующие значения по умолчанию из их таблицы сотрудников, и использовали, чтобы обновить его.Колонка Департамента получил обновление до продаж и зарплата обновлена ​​до NULL, как показано ниже.

 mysql> SELECT * FROM worker;
+ ----- + -------- + ------- + -------- +
| id | имя | отдел | зарплата |
+ ----- + -------- + ------- + -------- +
| 100 | Андрей | Продажи | NULL |
| 200 | Антон | Продажи | NULL |
| 300 | Максим | Продажи | NULL |
| 400 | Димон | Продажи | NULL |
| 500 | Антон | Продажи | NULL |
| 501 | Анна | Продажи | NULL |
+ ----- + -------- + ------- + -------- + 

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

В одном операторе обновления, вы также можете обновить значения для более чем столбца, как показано ниже.

В следующем примере, мы присваивая значения, как зарплаты и столбцы, DEPT для всех записей, где идентификатор сотрудника больше 300.

 mysql> UPDATE worker SET salary = 5000, dept = 'Marketing' WHERE id> 300;
Запрос в порядке, затронуты 3 строки (0,04 сек)
Совпал ряд: 3 Изменено: 3 Предупреждения: 0 

Как видно из вывода, вышеприведенная команда UPDATE обновляет два значения столбца в течение последних трех записей, которые соответствовали выше, когда выполнено условие.

 mysql> SELECT * FROM worker;
+ ----- + -------- + ----------- + -------- +
| id | имя | отдел | зарплата |
+ ----- + -------- + ----------- + -------- +
| 100 | Андрей | Продажи | NULL |
| 200 | Антон | Продажи | NULL |
| 300 | Максим | Продажи | NULL |
| 400 | Димон | Маркетинг | 5000 |
| 500 | Антон | Маркетинг | 5000 |
| 501 | Анна | Маркетинг | 5000 |
+ ----- + -------- + ----------- + -------- + 

Кроме того, помогите получить хорошую статью в команде UPDATE в MySQL, чтобы понять все доступные операции MySQL INSERT: 12 примеров в MySQL для команды INSERT.

6. Ограничение колличества записей при обновлении

Мы также можем использовать опцию LIMIT, чтобы ограничить количество записей, которые должны быть обновлены.

Даже если условие, где соответствует несколько записей, оператор обновления будет обновлять только 1-е X указано количество, указанное в значении LIMIT.

В следующем примере мы присваиваем зарплату всех записей до 6500, так как мы не имеем ГДЕ. Но мы используем LIMIT 3. Это означает, что она будет обновлять зарплату только первым трем для согласования условий согласования.

 mysql> UPDATE worker SET salary = 6500 LIMIT 3;
Запрос в порядке, затронуты 3 строки (0,01 сек)
Совпал ряд: 3 Изменено: 3 Предупреждения: 0 

Как видно из следующего выхода, только 1-е три записи обновляются предыдущей командой.

 mysql> SELECT * FROM worker;
+ ----- + -------- + ----------- + -------- +
| id | имя | отдел | зарплата |
+ ----- + -------- + ----------- + -------- +
| 100 | Андрей | Продажи | 6500 |
| 200 | Антон | Продажи | 6500 |
| 300 | Максим | Продажи | 6500 |
| 400 | Димон | Маркетинг | 5000 |
| 500 | Антон | Маркетинг | 5000 |
| 501 | Анна | Маркетинг | 5000 |
+ ----- + -------- + ----------- + -------- + 

Одна вещь, чтобы иметь в виду, что LIMIT 3 на самом деле означает, что обновление будет продолжать идти, пока он не обновит 3 записи. Вместо этого оператора обновления прекратит выполнение, как только он обработал первые 3 строки, которые соответствовали условию независимо от того, были ли действительно обновлены эти записи или нет.

7. Многократное обновление таблиц (с помощью Inner Join)

Можно также объединить две таблицы во время обновления. Можно также обновить значения из двух таблиц одновременно с помощью одного оператора обновления.

В этом примере мы будем использовать в таблице следующие преимущества наряду с нашей существующей таблицей сотрудников.

 mysql> SELECT * из выгоды;
+ ------------ + ------- +
| отдел | бонус |
+ ------------ + ------- +
| Продажи | 1000 |
| IT | NULL |
| Маркетинг | 800 |
+ ------------ + ------- + 

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

Это означает, что мы должны объединить оба работника и таблицу преимущества во время обновления, как показано ниже. Используйте общее поле между этими двумя таблицами в предложении ГДЕ. В этом примере общее поле dept.

Кроме того, сразу после ключевого слова UPDATE укажите имя обоих таблиц, как показано ниже. После ключевого SET можно указать либо имя или несколько столбцов, которые должны быть обновлены, либо из одной таблицы, или как в таблице.

 mysql> UPDATE worker, преимущества
    -> УСТАНОВИТЬ worker.salary = worker.salary + sizes.bonus
    -> ГДЕ рабочий.dept = Benefits.dept и Benefits.bonus не равно нулю;
Запрос в порядке, затронуты 4 строки (0,01 сек)
Совпадение строк: 4 Изменено: 4 Предупреждения: 0 

Обратите внимание, что в приведенном выше обновлении, мы используем внутреннее соединение.

Ниже приведен вывод после того, как приведенное выше утверждение обновление выполнено. Как вы видите ниже, зарплата работника получила увеличение на основе значений из таблицы выгоды.

 mysql> SELECT * FROM worker;
+ ----- + -------- + ------------ + -------- +
| id | имя | отдел | зарплата |
+ ----- + -------- + ------------ + -------- +
| 100 | Андрей | Продажи | 7500 |
| 200 | Антон | Продажи | 7500 |
| 300 | Максим | IT | 6500 |
| 400 | Димон | IT | 5000 |
| 500 | Антон | Маркетинг | 5800 |
| 501 | Анна | Маркетинг | 5800 |
+ ----- + -------- + ------------ + -------- + 

8. Множественное обновление таблиц (с помощью Left Join)

Аналогично предыдущему примеру внутреннего образца, мы можем также использовать левое соединение.

Когда мы используем внутреннее соединение, мы не указываем слово «внутреннее соединение», так как это по умолчанию при объединении нескольких таблиц.

Однако при соединении слева мы должны явно указать «левое соединение», как показано ниже.

 mysql> UPDATE worker LEFT JOIN преимущества для worker.отдел = выгоды.dept
    -> УСТАНОВИТЬ worker.salary = worker.salary + 500
    -> WHERE Benefits.bonus равен нулю;
Запрос в порядке, затронуты 2 строки (0,03 сек)
Совпало рядов: 2 Изменено: 2 Предупреждения: 0 

Вот выход после вышеуказанного обновления.

 mysql> SELECT * FROM worker;
+ ----- + -------- + ------------ + -------- +
| id | имя | отдел | зарплата |
+ ----- + -------- + ------------ + -------- +
| 100 | Андрей | Продажи | 7500 |
| 200 | Антон | Продажи | 7500 |
| 300 | Максим | IT | 7000 |
| 400 | Димон | IT | 5500 |
| 500 | Антон | Маркетинг | 5800 |
| 501 | Анна | Маркетинг | 5800 |
+ ----- + -------- + ------------ + -------- + 

9. Возврат обновленного значения (или значение до обновления)

В команде 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;
Запрос в порядке, затронута 1 строка (0,00 сек)
Совпадение строк: 1 Изменено: 1 Предупреждений: 0

mysql> ВЫБЕРИТЕ зарплату как tmp_salary FROM worker WHERE id = 400;
+ ------------ +
| tmp_salary |
+ ------------ +
| 5500 |
+ ------------ + 

В приведенном выше примере после того, как обновление было сделано, переменная tmp_salary имеет обновленную зарплату от приложения сотрудника

, очевидно, вы должны переключить последовательность из двух вышеупомянутых утверждений. В этом случае будет сначала ВЫБРАТЬ, а затем ОБНОВИТЬ.

Или вы можете использовать «@» в качестве части приложения UPDATE и получить ниже показано обновленное значение.

 UPDATE worker SET зарплата = зарплата + 500 ГДЕ id = 400
  И @tmp_salary: = зарплата 

В приведенной выше команде обновления сделано, переменная tmp_salary как обновленная зарплата для сотрудников ID 400. Как вы видите здесь, хотя значение заработной платы уже обновлено до 6000.Переменная tmp_salary, которая использовалась в приведенной выше команде UPDATE по-прежнему имеет значение 5500.

 mysql> SELECT * FROM worker WHERE id = 400;
+ ----- + ------- + ------------ + -------- +
| id | имя | отдел | зарплата |
+ ----- + ------- + ------------ + -------- +
| 400 | Димон | IT | 6000 |
+ ----- + ------- + ------------ + -------- +

mysql> ВЫБРАТЬ @tmp_salary;
+ ------------- +
| @tmp_salary |
+ ------------- +
| 5500 |
+ ------------- + 

10. Случай объединения или IF с обновлением

Вы также можете использовать условные обновления MySQL с помощью условных команд, как CASE, IF и т.д. Это полезно для упрощения обновления.

Вместо того, чтобы использовать несколько обновлений, вы можете просто обойтись с помощью одной команды UPDATE, которая сочетает в себе все ваши операции.

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

 UPDATE worker SET зарплата = зарплата + 1000 WHERE dept = 'Sales';
ОБНОВЛЕНИЕ работник УСТАНОВИТЬ зарплату = зарплата + 500 ГДЕ отдел = 'IT';
UPDATE worker SET зарплата = зарплата + 800 WHERE dept = 'Marketing'; 

Вы можете объединить все перечисленные выше заявления трех UPDATE в одном заявлении UPDATE использовать условие, как показано ниже.

 ОБНОВЛЕНИЕ УСТАНОВИТЬ зарплату рабочего =
  CASE dept
   КОГДА "Продажи" ТО зарплата + 1000
   КОГДА "ЭТО" ТОГДА зарплата + 500
   КОГДА "Маркетинг" ТОГДА зарплата + 500
   ELSE зарплата
  КОНЕЦ; 

Так же, как CASE, вы можете также использовать IF условие для обновления значения столбца соответственно.

11. Зачем использовать ЗАКАЗ с ЦИК Update?

Вы можете использовать значение ORDER BY во время обновления. Предложения ORDER BY, безусловно, имеет смысл во время SELECT. Но, зачем нам нужен ЗАКАЗ во время обновления.

, у вас есть уникальный идентификатор и поле идентификатора таблицы.

Когда вы выполните следующую команду, чтобы увеличить идентификатор сотрудника на 100, вы можете получить сообщение об ошибке дубликатом.

 mysql> UPDATE подрядчик установил id = id + 100;
ОШИБКА 1062 (23000): повторяющаяся запись «200» для ключа «ПЕРВИЧНЫЙ» 

Это происходит потому, что когда он пытается обновить значение цифрового устройства от 100 до 200, то уже есть существующая запись с помощью идентификатора, как 200. Поле ID также имеет уникальный UNIQUE, в данном случае это ПЕРВИЧНЫЙ ключ. Таким образом мы получаем вышеуказанную ошибку.

Для этого мы должны выполнить команду по команде с помощью системы Desc.

 mysql> UPDATE worker SET id = id + 100 заказ по id desc;
Запрос в порядке, затронуты 6 строк (0,01 сек)
Совпало рядов: 7 Изменено: 7 Предупреждений: 0 

В приведенном выше случае, сначала измените эту запись, а затем выполните эту запись. Таким образом, он никогда не будет иметь сценария текущего значения в процессе обновления.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl + Enter .

Предложение ДЛЯ ОБНОВЛЕНИЯ: Примеры | ora-sql.ru

  • Строки из обоих таблиц СОТРУДНИКОВ и ОТДЕЛЕНИЙ блокируются.

  • Используйте ДЛЯ ОБНОВЛЕНИЯ column_name , ​​чтобы квалифицировать столбец, который Вы намеревает изменить, тогда только строки из этой данной таблицы блокируются.

В пример на рисунке оператор ДЛЯ ОБНОВЛЕНИЯ блокирующих строк таблицы СОТРУДНИКОВ с JOB_ID установленным в ST_CLERK и LOCATION_ID установленным в 1500, и блокирует строки DEPARTMENTS с отделами DEPARTMENTS с отделами в 1500.

Можно использовать ДЛЯ ОБНОВЛЕНИЯ column_name , чтобы квалифицировать столбец, который вы намереваетесь изменить.

Список ИЗ предложений ДЛЯ ОБНОВЛЕНИЯ не ограничивает Вас изменением только столбцов выбранных строк. Блокировки все еще устанавливаются на все строки; если вы просто указываете FOR UPDATE в предложении FROM , ​​база данных заблокированы все идентифицированные строки для всех таблиц, перечисленных в предложении FROM .

Следующий оператор блокирует только те строки в таблице СОТРУДНИКОВ с ST_CLERK , ​​которые расположены в LOCATION_ID 1500. Никакие строки не блокируются таблицей DEPARTMENTS :

ВЫБЕРИТЕ e.employee_id, e.salary, e.commission_pct
ОТ сотрудников е ПРИСОЕДИНЯЙТЕСЬ к отделам d
ИСПОЛЬЗОВАНИЕ (Department_id)
ГДЕ job_id = 'ST_CLERK' И location_id = 1500
ДЛЯ ОБНОВЛЕНИЯ e.зарплата
ЗАКАЗАТЬ ПО e.employee_id;

В примере базы данных инструктируется ожидать в течение пяти секунд, пока строка станет доступной, и затем возвращает управление Вам.

ВЫБЕРИТЕ employee_id, salary, Commission_pct, job_id
ИЗ сотрудников
ГДЕ job_id = 'SA_REP'
ДЛЯ ОБНОВЛЕНИЯ ОЖИДАНИЕ 5
ЗАКАЗАТЬ ПО employee_id;

Далее: Создание и Удаление Синонимов

Команда SQL для удаления и обновления данных в базе (DELETE, UPDATE)

В базу данных можно не только добавить данные, но и удалить их оттуда.Ещё существует возможность обновить данные в базе. Рассмотрим оба случая.

Удаление данных из базы (DELETE)

Удаление из базы данных происходит с помощью команды «DELETE» (переводится с английского как «УДАЛИТЬ»). Функция удаляет не одну инструкцию, а несколько, при выборе для этого строки по логике функции «ВЫБРАТЬ». То есть чтобы удалить данные из базы, необходимо точно определить их. Приведём пример SQL команды для удаления одной строчки:
  УДАЛИТЬ ИЗ `ПОЛЬЗОВАТЕЛЕЙ` ГДЕ` ID` = 2 LIMIT 1;  
Благодаря этому запросу из таблицы «USERS» будет удалена одна запись, у которой в столбце «ID» стоит значение «2».

Обратите внимание, что в конце запроса стоит лимит на выборку «LIMIT 1;» размером в 1 строку. Его можно было не ставить, если поле «ID» является «ПЕРВИЧНЫМ КЛЮЧОМ» (первичный ключ, то есть содержит только уникальные значения). Но всё-таки рекомендуем ставить ограничение «LIMIT 1;» в любом случае, если вы намерены удалить только одну строчку.

Теперь попробуем удалить сразу диапазон данных. Для этого достаточно составить запрос, в результате выполнения которого вернётся несколько строк.Все эти строки будут удалены:
  УДАЛИТЬ ОТ `USERS` WHERE` ID`> = 5;  
Этот запрос удалит все строки в таблице, у которых в столбце «ID» стоит меньше 5. Если не поставить условий «WHERE» и лимита «LIMIT», то будут удалены абсолютно все строки в таблице:
  УДАЛИТЬ ИЗ `ПОЛЬЗОВАТЕЛЕЙ`;  

На некоторых версиях MySQL способ удаления всех строк через « DELETE FROM _; » может работать медленнее, чем « TRUNCATE _; «; Поэтому для очистки всей таблицы лучше всё-таки использовать «TRUNCATE».

Обновление данных в базе (UPDATE)

Функция обновления «ОБНОВЛЕНИЕ» (переводится с английского как «ОБНОВИТЬ») довольно часто используется в проектах сайтов. Как и в случае с функцией «УДАЛИТЬ», обновление не успокоится до тех пор, пока не обновятся все поля, которые подходят под условия, если нет лимита на выборку. Поэтому необходимо задавать однозначные условия, чтобы вместо одной строки нечаянно не обновить половину таблицы. Приведём пример использования команды «UPDATE»:
  ОБНОВЛЕНИЕ `USERS` SET` NAME` = 'Мышь' WHERE `ID` = 3 LIMIT 1;  
В этом примере, в таблицее «ПОЛЬЗОВАТЕЛИ» будет установлено значение «Мышь» в столбец «ИМЯ» у строки, в столбце «ID», которой стоит значение «3».Можно сразу обновить несколько столбцов у одной записи, передав значения через запятую. Попробуем но обновить не только значение с толбце «NAME», и значение в столбце «FOOD», используя один запрос:
  ОБНОВЛЕНИЕ `USERS` SET` NAME` = 'Мышь', `FOOD` = 'Сыр' WHERE` ID` = 3 LIMIT 1;  
Если не поставить никаких лимитов LIMIT и условий WHERE, то все записи таблицы будут обновлены без исключений.

SQL Update с Case, либо назначать, либо ничего не делать



Исходя из этого вопроса здесь, можно сделать утверждение CASE в SQL UPDATE , ​​которое либо обновляет, либо ничего не делает.В настоящее время у меня есть следующее:

  ОБНОВИТЬ адрес клиента
SET IsPrimaryAddress = CASE WHEN c2.IsPrimaryAddress = 1 THEN 1 ELSE 0 END
ОТ CustomerAddress
присоединиться к #AddressToDeleteMasterOfLesserId p1 на CustomerAddress.Id = p1. [Id that is master]
присоединиться к CustomerAddress c2 на p1. [Id to delete] = c2.Id
  

Проблема возникает на этой линии:

  УСТАНОВИТЬ IsPrimaryAddress = CASE WHEN c2.IsPrimaryAddress = 1 THEN 1 ELSE ** 0 ** END
  

Когда я устанавливаю его на 0 в случае потери.Обновление должно проверить первое условие, и если это так, установите значение 1, но, если условие не выполнено, я не хочу установить значение 0, мне нужно сохранить исходное значение.

  УСТАНОВИТЬ IsPrimaryAddress = CASE WHEN c2.IsPrimaryAddress = 1 THEN 1 ELSE * CustomerAddress.IsPrimary * END
  

Однако это не работает, потому что он получает значение из инструкции ОТ , ​​а не то значение, которое было установлено в данный момент. То, что я хочу, это что-то вроде этого

  УСТАНОВИТЬ IsPrimaryAddress = CASE WHEN c2.IsPrimaryAddress = 1 THEN 1 ELSE * Ничего не делать * END
  

Но это все равно задание, и он пытается установить значение NULL .

Возможно ли это выше?

ОБНОВЛЕНИЕ:

Выборочные данные:

пара ID-х, которые следует отметить как таковой

  ID для сохранения ID для удаления
------------------------
10 21
10 22
11 31
12 41
  

Я сосредоточусь на том, что происходит с 10.Так что 10 имеет IsPrimaryAddress = 0 , ​​в 21 IsPrimaryAddress = 1 , ​​и 22 имеет IsPrimaryAddress = 0 .

Я верю, что происходит вот что (в псевдокоде):

Набор IsPrimaryAddress = если 21.IsPrimaryAddress = 1 затем 21.IsPrimaryAddress еще набор для 10.IsPrimaryAddress

Итак, мы установили 10.IsPrimaryAddress на 1. Сейчас:

Набор IsPrimaryAddress = если 22.IsPrimaryAddress = 1 затем 22.IsPrimaryAddress еще набор для 10.IsPrimaryAddress

Что, как я надеюсь, 10.IsPrimaryAddress равно 1. Но он, похоже, получил исходное значение, которое было 0, и теперь обновление было потеряно.

sql sql-server-2008 sql-update
Поделиться Источник dann.dev 21 марта 2012 в 21:03

3 ответа


  • Инструкция SQL Update Ничего Не Делает

    У меня есть оператор SQL Update, который при запуске в VS2010 через новое окно запроса работает, но когда я структурирую его как оператор обновления, ничего не происходит.Мне было интересно, может ли кто-то увидеть, что я делаю не так? Как я уже сказал, код работает при выполнении через окно . ..

  • Как ничего не делать в операторе SQL case?

    Мне нужно обновить столбец условно и в некоторых случаях не обновлять его вообще. это лучший способ, который я могу придумать, чтобы сделать это, но кажется, что это может быть неэффективно в ИНАЧЕ, поскольку он все еще обновляет столбец с текущей величиной столбца. Есть ли лучший способ в котором…



6

  УСТАНОВИТЬ CustomerAddress.IsPrimaryAddress =
      КЕЙС
         КОГДА c2.IsPrimaryAddress = 1
         ТО 1
         ELSE CustomerAddress.IsPrimaryAddress
      КОНЕЦ
  

PS: я не уверен насчет имени таблицы, но идея заключается в том, чтобы вернуть его значение столбца, чтобы оставить его неизменным, это обычная практика.

Поделиться sll 21 марта 2012 в 21:06



3

Просто добавьте предложение ГДЕ, чтобы обновить только те строки, которые нуждаются в обновлении:

  ОБНОВЛЕНИЕ CustomerAddress c1
  INNER JOIN #AddressToDeleteMasterOfLesserId p1 ON c1. Id = p1. [Id that is master]
  ВНУТРЕННЕЕ СОЕДИНЕНИЕ CustomerAddress c2 ON p1. [Id to delete] = c2.Id
  НАБОР c1.IsPrimaryAddress = 1
  ГДЕ c2.IsPrimaryAddress = 1
  

Поделиться Нил 21 марта 2012 в 21:15



1

  ОБНОВЛЕНИЕ c
УСТАНОВИТЬ IsPrimaryAddress = CASE
  КОГДА c2.IsPrimaryAddress = 1 ТО 1
  ELSE c.IsPrimaryAddress
КОНЕЦ
ОТ dbo.CustomerAddress AS c
INNER JOIN #AddressToDeleteMasterOfLesserId AS p1
  ON c.Id = p1. [Id, который является главным]
INNER JOIN dbo.CustomerAddress AS c2
  ВКЛ p1. [Id для удаления] = c2.Id;
  

Поделиться Аарон Бертран 21 марта 2012 в 21:05


  • Обновление T-SQL с оператором switch-case

    Я хочу реализовать этот псевдокод в t-sql UPDATE Resources SET [Path] = CASE ([Path].Подстрока ([Путь] . LastIndexOf (‘.’))) WHEN ‘.jpg’ THEN ‘/image.jpg’ WHEN ‘.png’ THEN ‘/image.jpg’ WHEN ‘.avi’ THEN ‘/video.jpg’ WHEN ‘.mkv’ THEN ‘/video.jpg’ для этого я использую это решение UPDATE Resources SET …

  • Использование оператора Case либо для Insert в таблицу, либо для обновления существующей строки

    Возможный Дубликат: Решения для INSERT или обновления на сервере SQL Только вставка строки, если это еще не существует Мой титул в степени объясняю то, что я пытаюсь сделать, но я расу немного подробнее.Я создаю хранимую среду, когда она вызывается, сначала проверяет, …


Похожие вопросы:


jQuery найти элемент еще ничего не делать?

Я пытаюсь использовать jQuery, чтобы в основном обернуть кучу модификаций CSS через jQuery, но на страницах, где не существует идентификаторов или классов, я получаю ошибки? Нравится …


Иначе ничего не делать SQL-запрос

У меня есть поле, froiexported, в DB таблице request3, который либо установлен в один или ноль. Я хочу запустить обновление, где, если дело в операторе выполнено, значение в Froiexported …


SQL Update с заявлением CASE

Я собираюсь использовать примеры таблиц. tblAnimal: ——————————— | Животное | Цвет | Пол | ——————————— | Собака | | | ———————————…


SQL Инструкция Update Ничего Не Делает

У меня есть оператор SQL Update, который при запуске в VS2010 через новое окно запроса работает, но когда я структурирую его как оператор обновления, ничего не происходит.Мне было интересно, может …


Как ничего не делать в операторе SQL case?

Мне нужно обновить столбец условно и в некоторых случаях не обновлять его вообще. это лучший способ, который я могу придумать, чтобы сделать это, но кажется, что это может быть неэффективно в ИНАЧЕ, …


Обновление T-SQL с оператором switch-case

Я хочу реализовать этот псевдокод в t-sql UPDATE Resources SET [Path] = CASE ([Path] . Substring ([Path] .LastIndexOf (‘.’))) WHEN’ .jpg ‘THEN’ /image.jpg ‘WHEN’ .png ‘THEN’ /image.jpg ‘WHEN’ .avi ‘THEN …


Использование оператора Case либо для Вставить в таблицу, либо для обновления существующей строки

Возможный Дубликат: Решения для INSERT или обновления на сервере SQL Только вставка строки, если это еще не существует Мой титул в степени объясняет то, что я пытаюсь сделать, но …


Обновление SQL с CASE

не могли бы вы помочь мне с этим SQL? ОБНОВЛЕНИЕ ВЕРСИИ НАБОР VERSION_STATUS_ID = IF ((SELECT COUNT (*) from VERSION where KEY = ‘ABC’)> 1, 5, 6) WHERE VERSION_ID = 1; Отчет об ошибке — SQL ошибка :…


SQL триггер UPDATE, вставить предложение Case

Каков правильный синтаксис для создания SQL, обновляет другую таблицу обновленные или вставленные значения И поле, которое указать, было ли это UPDATE или INSERT. Пример того, что я …


Postgres: использование в конфликте вместе с CASE

Я пытаюсь определить точный синтаксис, который я должен использовать для выполнения на Conflict вместе с CASE. У меня есть таблица (игнорировать id, здесь это не актуально): СОЗДАТЬ ТАБЛИЦУ…

Руководство по SQL. Изменение данных. — ПРОСЕЛИТЕ

Для изменения уже использованных данных мы используем SQL запрос ОБНОВЛЕНИЕ .
Для того, чтобы указать, какие именно данные необходимо изменить, мы должны использовать условный оператор WHERE .

Данный запрос имеет следующий вид:

 
ОБНОВЛЕНИЕ имя_таблицы
SET колонка1 = значение1, колонка2 = значение2, колонкаN = значениеN
ГДЕ [условие1];
 
 

Мы также можем использовать операторы И / ИЛИ для уточнения условий.

Пример:

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

 
+ ---- + ------------------- + ------------ + ----------- - + -------- +
| ID | ИМЯ | СПЕЦИАЛЬНОСТЬ | ОПЫТ | ЗАРПЛАТА |
+ ---- + ------------------- + ------------ + ----------- - + -------- +
| 1 | Евгений Сулейманов | Java | 2 | 2000 |
| 2 | Петр Романенко | Java | 3 | 3500 |
| 3 | Андрей Комаров | JavaScript | 2 | 2100 |
| 4 | Константин Гейко | C # | 2 | 2000 |
| 5 | Ася Сулейманова | UI / UX | 2 | 1800 |
+ ---- + ------------------- + ------------ + ----------- - + -------- +
 
 

Допустим, нам необходимо изменить зарплату разработчика с именем Eugene Suleimanov. Для этого мы должны использовать следующую команду:

 
mysql> ОБНОВЛЕНИЕ разработчиков
УСТАНОВИТЬ ЗАРПЛАТУ = 2500
ГДЕ ИМЯ, КАК «Евгений Сулейманов»;
 
 

В результате наша запись будет изменена и наша таблица будет содержать уже такие данные:

 
+ ---- + ------------------- + ------------ + ----------- - + -------- +
| ID | ИМЯ | СПЕЦИАЛЬНОСТЬ | ОПЫТ | ЗАРПЛАТА |
+ ---- + ------------------- + ------------ + ----------- - + -------- +
| 1 | Евгений Сулейманов | Java | 2 | 2500 |
| 2 | Петр Романенко | Java | 3 | 3500 |
| 3 | Андрей Комаров | JavaScript | 2 | 2100 |
| 4 | Константин Гейко | C # | 2 | 2000 |
| 5 | Ася Сулейманова | UI / UX | 2 | 1800 |
+ ---- + ------------------- + ------------ + ----------- - + -------- +
 
 

Если мы хотим изменить несколько полей, например, опыт и зарплату, то наш запрос будет иметь следующий вид:

 
mysql> ОБНОВЛЕНИЕ разработчиков
УСТАНОВИТЕ ОПЫТ = 3, ЗАРПЛАТУ = 2500
ГДЕ ИМЯ, КАК «Андрей Комаров»;
 
 

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

 
+ ---- + ------------------- + ------------ + ----------- - + -------- +
| ID | ИМЯ | СПЕЦИАЛЬНОСТЬ | ОПЫТ | ЗАРПЛАТА |
+ ---- + ------------------- + ------------ + ----------- - + -------- +
| 1 | Евгений Сулейманов | Java | 2 | 2500 |
| 2 | Петр Романенко | Java | 3 | 3500 |
| 3 | Андрей Комаров | JavaScript | 3 | 2500 |
| 4 | Константин Гейко | C # | 2 | 2000 |
| 5 | Ася Сулейманова | UI / UX | 2 | 1800 |
+ ---- + ------------------- + ------------ + ----------- - + -------- +
 
 

На этом мы заканчиваем изучение способов использования данных.
В следующей статье мы рассмотрим процесс удаления записей.

Как я могу сделать оператор UPDATE с JOIN в SQL Server?

Вы получите наилучшую производительность, если вы забудете предложение, где и поместите все условия в выражение ON.

Я думаю, это потому, что запрос сначала должен объединить таблицы, а затем выполнить предложение, где, поэтому, если вы можете уменьшить то, что требуется для объединения, это быстрый способ получить результаты / выполнить обновление.

пример

сценарий

У вас есть таблица пользователей. Они могут войти в систему, используя свое имя пользователя или адрес электронной почты или account_number. Эти учетные записи могут быть активными (1) или неактивными (0). Эта таблица имеет 50000 строк

затем у вас есть таблица пользователей, которую нужно отключить за один раз, потому что они все сделали что-то плохое. Эта таблица, однако, имеет один столбец со смешанными именами пользователей, адресами электронной почты и номерами счетов. Он также имеет индикатор has_run, который должен быть установлен в 1 (true), когда он был запущен

запрос

  ОБНОВЛЕНИЕ пользователей Пользователь
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ
        blacklist_users BlacklistUser
        НА
        (
            User.username = BlacklistUser.account_ref
            ИЛИ
            User.email = BlacklistedUser.account_ref
            ИЛИ
            User.phone_number = BlacklistUser.account_ref
            И
            User.is_active = 1
            И
            BlacklistUser.has_run = 0
        )
    НАБОР
        User.is_active = 0,
        BlacklistUser.has_run = 1;  

аргументация

. Если бы нам пришлось присоединиться к условиям, ИЛИ, по сути, нужно было бы проверить установку 4 раза. Однако, предоставляя ему больше условий, он может «пропустить» много строк, если они не удовлетворяют всем условиям при соединении.

бонус

Это более читабельно.Все условия находятся в одном месте, а строки для обновления — в одном месте

обновить и удалить — Перевод на русский — примеры английский

На основании вашего запроса эти примеры могут содержать грубую лексику.

На основании вашего запроса эти примеры могут содержать разговорную лексику.

В дополнение к извлечению объектов (запросы SELECT) JPQL поддерживает запросы UPDATE и DELETE на основе набора.

В дополнение к получению объектов (SELECT-запросы), JPQL запросы, основанные на операторах UPDATE и DELETE .

Advanced Query Builder — это мощный набор компонентов для Borland Delphi и C ++ Builder, предназначенный для визуального построения операторов SQL для предложений SELECT, INSERT, UPDATE и DELETE .

Advanced Query Builder — это набор компонентов для Borland Delphi и C ++ Builder, специально предназначенный для визуального построения запросов SQL для функций SELECT, INSERT, UPDATE и DELETE .

Параметры обновления и удаления доступны только в том случае, если они поддерживаются используемой базой данных.

Параметры обновления и удаление доступны только в том случае, если они поддерживаются используемой базой данных.

Список столбцов первичного ключа таблицы; для операций обновления и удаления наличие первичного ключа обязательно.

Список колонок первичного ключа таблицы. Для операций изменений и удаления наличие первичного ключа обязательно.

Предложить пример

Другие результаты

Контроллеры связываются с сервером API для создания, , обновления , и удаления ресурсов, которыми они управляют (модули, конечные точки служб и т. Д.).

Контроллеры взаимодействуют с сервером API Kubernetes, создавая, обновляя и удаляя управляемые ими ресурсы (поды, точки входа в сервисы и другие).

Необходимо отредактировать текст запросов для вставки, обновить , удалить вручную и с по удалить этот столбец из обновления .

Например, нельзя использовать хранимые процедуры INSERT, DELETE, или UPDATE и , которые не возвращают набор записей в тексте.

Например, в тексте нельзя использовать INSERT, DELETE или UPDATE, а так же указывать хранимые процедуры, которые не возвращают набор данных (Recordset).

Кроме стандартных операций UPDATE , DELETE , появилась еще одна новая инструкция UPDATE OR INSERT RETURNING.

Данная возможность появилась позже в версии Firebird 2.1. Помимо стандартных операций UPDATE , DELETE , добавлена ​​еще одна новая инструкция UPDATE ИЛИ ВСТАВИТЬ ВОЗВРАТ.

Visual Studio.Net может генерировать код запросов для методов вставки, , обновления, , , удаления, .

VS.Net 2005 умеет генерировать код запросов для методов insert, обновить , удалить .

При выполнении SQL-запросов (INSERT, UPDATE , DELETE ) MSSQL пытается запустить вложенную транзакцию.

При выполнении SQL-запроса INSERT, UPDATE и DELETE , MSSQL пытается стартовать вложенную транзакцию.

Так что, если вам потребовалась поддержка методов ADODB.Recordset — AddNew, Update , Delete , то теперь она доступна через компоненты службы ADODB.

Так что, если вы нуждались в поддержке методов ADODB.Recordset — AddNew, Обновление , Удалить , то теперь она доступна через сервисные компоненты ADODB.

После установки обновления вы можете удалить загружаемый файл для экономии места.

Query Analyzer оснащен Database Explorer, который позволяет быстро извлекать метаданные объекта для мгновенного изменения или генерировать операторы SELECT, INSERT, UPDATE или DELETE на основе структуры таблицы.

План запроса показывается в графическом виде, что сильно упрощает понимание того, как работает ваш запрос и какие индексы с какой характеристикой он использует.

Его можно использовать в UNION, любых подзапросах, и в командах DELETE и UPDATE .

Может быть использован в UNION, любых подзапросах, и так же в команде УДАЛИТЬ и ОБНОВИТЬ .

Или команды вставки, удаления и обновления могут выполняться в простых функциях, таких как registeruser или loginuser, хранящиеся на уровне доступа к данным.

Или команды создания, удаления и обновления могут быть выполнены внутри простых функций как registerUser или loginUser, хранимые в слое доступа к данным.

Если информацию о таких изменениях в базе данных необходимо сохранить, можно использовать моделирование битемпоральной привязки, где в дополнение к обновлениям , также операторы delete и становятся неразрушающими.

Если необходимо сохранить информацию о таких изменениях в базе данных, можно использовать моделирование с привязкой к бидемоповым якорям, где в дополнение к обновлениям удаленные операторы становятся неразрушающими.

По закону они обязаны удалить или обновить любую информацию, которая оценивается как неточная или более не имеющая отношения к их полномочиям, работе надзорных органов или возможным судебным разбирательствам.

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

Затем поисковая машина автоматически сохранит содержимое проиндексированных сайтов, обновит каждую страницу, которую она уже сохранила, с определенными интервалами и удалит тех, которые больше не доступны на веб-сайтах узлов.

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

Простите, но с каких это пор персонал обновляет , отправляя файлы на удаленный сервер и удаляя все ?

Очистите веб-кеш и удалите временные файлы .