2014-12-23 3 views
0

사용자 ID가 주어진 사용자 ID와 동일한 지정된 column-name의 값을 업데이트하는 prodecure를 작성하려고합니다.동적 MySQL 업데이트 문

_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'); 

그렇지 않으면, 당신은 1@columns을 비교하고, 유효하지 않은 SQL을 생성하는 SQL에 (난 당신이 1라는 이름의 열이 의심 때문에, 아마 항상 0) 1 또는 0 중을 연결.

위의 코드는 하나의 열만 업데이트한다는 점에 유의하십시오. @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); 

난 당신도 그냥 주어진 ID에 대한 행을 업데이트 있도록이 SQL에 WHERE 절을 추가해야합니다 생각한다. 현재 작성된대로 모든 행이 갱신됩니다.

이렇게 쿼리를 작성해야한다는 사실은 데이터의 부적절한 정규화를 의미합니다. 다른 열에 각 환경 설정 옵션이있는 대신 키의 문자가 (user_id, setting_name) 인 테이블의 다른 행이어야합니다.

+0

글쎄, 나는 20 개의 개별 카테고리 컬럼 중에서 3 개의 특정 카테고리 컬럼을 업데이트하는 솔루션을 찾고있다. 내가 할 수있는 유일한 다른 방법은 카테고리 열을 만드는 것입니다,하지만 이것은 사용자가 데이터 사용자 당 최대 20 행을 갖게 될 것입니다 ... 어쩌면 그게 해결책은 아니지만 효율적으로 보이지 않습니다. – wUmpage

+1

답변을 업데이트했습니다. 패턴과 일치하는 3 개의 열을 사용하여이를 수행하는 방법을 보여줍니다. – Barmar

+0

적절한 인덱스가 있으면 효율적입니다. 동적 SQL을 작성하는 경우 언제든지 설계에 문제가 있음을 강하게 고려해야합니다. 일반적으로 메타 데이터가 아닌 데이터의 필드를 검색해야합니다. – Barmar