Обновить сразу несколько строк в MySQL

У меня есть вектор ценностей

вектор = [10, 11, 10, 11, 12];

и инициализированная таблица базы данных

Обновить сразу несколько строк в MySQL

Моя цель - обновить значение каждой строки (которая инициализирована до -1) значением из вектора. Таким образом, id = 1 будет иметь значение 10, id = 2, значение 11 и т. д.

Я могу делать это в цикле, т.е. для каждого значения в векторе обновлять соответствующую строку.

Однако мне было интересно, могу ли я сделать это с помощью одного оператора обновления. Я использую MySQL.

Окончательное состояние после обновления должно быть:

Обновить сразу несколько строк в MySQL

N-я строка (отсортированная) в базе данных должна иметь N-е значение вектора.

Является ли идентификатор первичным ключом в вашей таблице? и Каким будет значение id в третьей записи?

QuakeCore 16.05.2018 10:04

Да, id - это первичный ключ. Значение N-й записи будет значением (Nth-1) в векторе (при условии, что индекс вектора начинается с 0)

cateof 16.05.2018 10:06

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

QuakeCore 16.05.2018 10:08

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

Nerevar 16.05.2018 10:11

@Nerevar Я добавил экран печати, чтобы показать окончательное состояние.

cateof 16.05.2018 10:16

Хорошо, спасибо, это то, что я подумал в первую очередь, но первый ответ, который был дан на ваш вопрос, смутил меня

Nerevar 16.05.2018 10:18
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
2
6
63
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете сделать следующее (насколько я знаю, это невозможно сделать с помощью оператора обновления):

INSERT INTO table (id,value) VALUES (1,10),(2,11),(3,10),(4,11),(5,12)
ON DUPLICATE KEY UPDATE value=VALUES(value)

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

Предлагаю вам преобразовать свой вектор в таблицу:

CREATE TEMPORARY TABLE Vectors(
ID int NOT NULL AUTO_INCREMENT,
Value int not null)

INSERT INTO Vectors VALUES(10),(11),(10) ...

UPDATE MyTable AS T 
INNER JOIN Vectors AS V ON V.ID=T.ID 
SET T.Value = V.Value 
WHERE T.Value = -1

DROP TEMPORARY TABLE Vectors

ПОПРОБУЙ ЭТО: Я думаю, мы можем добиться этого с помощью UNION ALL в одном запросе

UPDATE test t
INNER JOIN (
            SELECT 1 id, 10 val UNION ALL
            SELECT 2 id, 11 val UNION ALL
            SELECT 3 id, 10 val UNION ALL
            SELECT 4 id, 11 val UNION ALL
            SELECT 5 id, 12 val) vector ON vector.id = t.id
SET t.val = vector.val           
WHERE t.val = -1;

Другие вопросы по теме