2014-12-23 6 views
0

Я пытаюсь написать prodecure, который обновляет значение в указанном столбце-имени, где идентификатор пользователя равен данному ID пользователя.Dynamic MySQL Update Statement

_strong_1 - это переменная, которая содержит имя столбца, например: «category_1».

SELECT COLUMN_NAME FROM information_schema.`COLUMNS` C 
WHERE table_name = 'subscribers_preferences' AND COLUMN_NAME LIKE _strong_1 INTO @columns; 

SET @table = 'subscribers_preferences'; 
SET @s = CONCAT('UPDATE ',@table,' SET ', @columns = 1); 

PREPARE stmt FROM @s; 
EXECUTE stmt; 

В операторе 'SET @s =' есть ошибка. Я могу заставить его работать с простым оператором SELECT, но UPDATE сложнее.

Заранее спасибо.

+0

Сколько столбцов указано в столбцах '@ columns'? Если у вас более одного, то вам нужно добавить '= 1' в конце каждого столбца. В противном случае у вас есть 'column1, column2 = 1', что является неправильным синтаксисом, оно должно быть' column1 = 1, column2 = 1'. – Taryn

+0

Правильно ли указано '@columns = 1'? – aldux

ответ

1

Вы должны поставить = 1 в кавычки.

SET @s = CONCAT('UPDATE ',@table,' SET ', @columns, ' = 1'); 

В противном случае, вы сравниваете @columns с 1 и конкатенации либо 1 или 0 (вероятно, всегда 0, так как я сомневаюсь, что у вас есть столбец с именем 1) в SQL, которая создает недопустимый SQL.

Обратите внимание, что приведенный выше код обновит только один столбец. Если @columns должен содержать 3 столбца, вам нужно использовать GROUP_CONCAT в запросе, который его устанавливает.

SELECT GROUP_CONCAT(CONCAT(column_name, ' = 1')) AS @columns 
FROM information_schema.columns 
WHERE table_name = 'subscribers_preferences' and column_name LIKE _strong_1; 
SET @table = 'subscribers_preferences'; 
SET @s = CONCAT('UPDATE ',@table,' SET ', @columns); 

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

Тот факт, что вам нужно написать такой запрос, предполагает неправильную нормировку ваших данных. Вместо того, чтобы иметь каждую опцию предпочтения в другом столбце, они должны быть разными строками таблицы, причем ключ имеет значение (user_id, setting_name).

+0

Ну, я ищу решение для обновления 3 столбцов конкретной категории из 20 столбцов отдельных категорий. Единственный способ, которым я мог бы это сделать, - создать столбец категории, но это приведет к тому, что пользователи будут иметь от 20 до строк данных пользователя PER ... возможно, это решение, но оно не кажется эффективным – wUmpage

+1

Я обновил ответ на покажите, как это сделать, используя 3 столбца, соответствующие шаблону. – Barmar

+0

Эффективно, если у вас есть соответствующие индексы. Каждый раз, когда вы обнаруживаете, что пишете динамический SQL, вы должны серьезно подумать, что с вашим дизайном что-то не так. Обычно вы должны искать поля в своих данных, а не метаданные. – Barmar