У меня есть вектор ценностей
вектор = [10, 11, 10, 11, 12];
и инициализированная таблица базы данных
Моя цель - обновить значение каждой строки (которая инициализирована до -1) значением из вектора. Таким образом, id = 1 будет иметь значение 10, id = 2, значение 11 и т. д.
Я могу делать это в цикле, т.е. для каждого значения в векторе обновлять соответствующую строку.
Однако мне было интересно, могу ли я сделать это с помощью одного оператора обновления. Я использую MySQL.
Окончательное состояние после обновления должно быть:
N-я строка (отсортированная) в базе данных должна иметь N-е значение вектора.
Да, id - это первичный ключ. Значение N-й записи будет значением (Nth-1) в векторе (при условии, что индекс вектора начинается с 0)
Я вижу повторяющиеся записи в векторе, и, поскольку идентификатор является первичным ключом, обновление не может быть выполнено.
Пожалуйста, покажите ожидаемый конечный результат, не используя "и т. д.", Чтобы описать его, так как в вашем случае может быть много решений.
@Nerevar Я добавил экран печати, чтобы показать окончательное состояние.
Хорошо, спасибо, это то, что я подумал в первую очередь, но первый ответ, который был дан на ваш вопрос, смутил меня






Вы можете сделать следующее (насколько я знаю, это невозможно сделать с помощью оператора обновления):
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;
Является ли идентификатор первичным ключом в вашей таблице? и Каким будет значение id в третьей записи?