#mysql
Вопрос:
Мой старый стол был похож на этот:
ID | A | B |
---- --- ---
112 | 2 | 2 |
345 | 3 | 0 |
А теперь вот так:
ID | type | value |
---- ------ -------
112 | A | 2 |
112 | B | 2 |
345 | A | 3 |
345 | B | 0 |
Таким образом, обновление (например) A
и B
если оба были равны для определенного идентификатора, раньше было простым без выбора. Но в этом новом типе таблиц есть ли способ добиться того же самого?
В случае, если это невозможно, есть ли INSERT ... ON DUPLICATE KEY UPDATE
у вас что-нибудь, что я мог бы использовать, чтобы сделать это возможным? (даже если это плохая практика, это только для целей тестирования!)
Комментарии:
1. Поэтому, чтобы убедиться, что я понимаю… Вы хотите обновить обе первые две строки во второй таблице, потому что они оба имеют идентификатор 112?
2. значит, идентификатор НЕ является первичным ключом?
3. я хочу обновить A и B одного и того же идентификатора (скажем, 112), если оба они равны (в данном примере это будет сделано, поскольку и A, и B из 112 равны). И первичный ключ (идентификатор,тип)
4. Если мой ответ решил вашу проблему, пожалуйста, отметьте ее как решенную. Если это не так, пожалуйста, объясните, почему это было неадекватно, и я сделаю все возможное, чтобы это исправить. Спасибо.
Ответ №1:
Это должно привести к обновлению всех строк, имеющих одинаковое значение и одинаковый идентификатор, до 5. Вы можете заменить оператор SET любыми строками или значениями, которые пожелаете.
UPDATE new
SET value=5
WHERE ID IN (
SELECT ID as outerID
FROM new
WHERE (
SELECT COUNT(DISTINCT value)
FROM new
WHERE ID=outerID
) = 1
);
Я не уверен, что подзапросы противоречат вашему правилу «без выбора», но, насколько я могу судить, вам понадобится выбор для выполнения сравнения, необходимого для этого. Это также будет работать только в том случае, если ВСЕ столбцы значений строк одинаковы, а не только ТЕ, которые одинаковы.