2013-04-18 1 views
0

을 만듭니다. 문제는 내가 이것을 방아쇠에 쓰고 싶다는 것입니다!에서 내가 동적 ALTER TABLE 명령을 만들려고 해요하지만 명령 중 일부는 쿼리에서 생성됩니다 TRIGGER

시도 1 :

ALTER TABLE `redinfomanager` CHANGE `Unterkategorie` `Unterkategorie` ENUM(("SELECT GROUP_CONCAT(CONCAT('\'', REPLACE(`Unterkategorien`, '\r\n', '\',\''), '\'') SEPARATOR ',') FROM `kategorien` GROUP BY '1'")) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL; 

시도 2 ​​:

SELECT @tmp:=GROUP_CONCAT(CONCAT('\'', REPLACE(`Unterkategorien`, '\r\n', '\',\''), '\'') SEPARATOR ',') FROM `kategorien` GROUP BY '1'; 
SET @query=CONCAT('ALTER TABLE `redinfomanager` CHANGE `Unterkategorie` `Unterkategorie` ENUM(', @tmp, ') CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL'); 
PREPARE stmt FROM @query; 
EXECUTE stmt; 

시도 3 :

SET @kat = (SELECT GROUP_CONCAT(CONCAT('\'', REPLACE(`Unterkategorien`, '\r\n', '\',\''), '\'') SEPARATOR ',') FROM kategorien GROUP BY '1'); 
PREPARE stmt FROM 'ALTER TABLE redinfomanager CHANGE Unterkategorie Unterkategorie ENUM(?) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL'; 
EXECUTE stmt USING @kat; 

그것은 나를 알려줍니다

1064 - Y를 o SQL 구문에 오류가 있습니다. MySQL 서버 버전에 해당하는 설명서를 확인하여 올바른 구문을 사용하십시오. '; 나는 그것을 할 수있는 방법

1 호선에서`Unterkategorie Unte을 표 redinfomanager 변경을 ALTER 'FROM stmt를 준비?

그 오류는 무엇을 의미합니까?

+0

정말 *이 될 가능성이 * 나쁜 생각 - 'ALTER TABLE' 테이블 잠금, 종종 매우 느린 될 수있는, 전체 테이블을 다시 작성하는 데 끝날 것 테이블이 큰 경우 작업. 가능한 값의 집합이 잘 정의되지 않은 컬럼이 있다면'ENUM()'을 사용하지 마십시오. 대신에'VARCHAR' 또는 이와 유사한 것을 사용하십시오. – duskwuff

+0

음, 테이블이 너무 크지는 않습니다. 이 세트는 전혀 변경되지 않을 것이지만 지금은 테스트 단계에 있으므로 변경 사항을 손으로 직접 수정할 수 있으므로 설정을 변경하여 변경 사항을 확인할 수 있습니다. 하지만이 방법을 사용할 수 있습니까 ??? – BrainStone

+1

'ENUM'을 사용하지 마십시오. 적절히 크기가 정해진 'VARCHAR' 컬럼은 거의 동일하게 동작 할 것이고, 테이블을 수정하지 않고서도 모든 문자열 값을 사용할 수 있습니다. – duskwuff

답변

1

그것은 당신이 첫 번째 테이블의 모든 삽입 한 후 두 번째 테이블에 ENUM 값을 변경하고 있다는 것? 왜 그걸 foreign key constraint으로 만듭니 까? 그것도 당신이 훨씬 더 효율적입니다 표 1의 값을 가져야한다 표 2에 넣어 원하는 값이 필요합니다 :

그냥 예 (sqlfiddle link) :

CREATE TABLE category (
    id INT PRIMARY KEY NOT NULL AUTO_INCREMENT, 
    description VARCHAR(50) 
); 

CREATE TABLE thing (
    id INT PRIMARY KEY NOT NULL AUTO_INCREMENT, 
    cat_id INTEGER, 
    description VARCHAR(50), 
    FOREIGN KEY (cat_id) REFERENCES category(id) 
); 

INSERT INTO category (description) 
VALUES 
    ('Category 1') 
    ,('Category 2'); 

INSERT INTO thing (cat_id, description) 
VALUES 
    (1, 'Thing 1') 
    ,(1, 'Thing 2') 
    ,(2, 'Thing 3'); 

INSERT INTO thing (cat_id, description) 
VALUES 
    (3, 'Imma Fail!') 

하는 경우를 당신은 category 테이블에 id이 3이 아니기 때문에 세 번째 삽입이 실패합니다. 트리거에서`ALTER TABLE` 명령을 실행

+0

sqlfiddle 링크가 위의 것과 같지 않은 것처럼 보입니다 ... 오류가있는 스키마를 작성할 때 저장하지 않을 것입니다 (아마도':)').). 하지만 위의 내용을 복사하여 붙여 넣으면 스키마를 만들 때 다음과 같은 오류가 발생합니다.'Schema Creation Failed : 자식 행을 추가하거나 업데이트 할 수 없습니다 : 외래 키 제약 조건이 실패했습니다 (''db_2_f1164''.''thing' ', CONSTRAINT''thing_ibfk_1'' FOREIGN KEY (''cat_id'') 참조''category'' (''id'')) :' – bhamby

+0

고마워요! 이것은 효과가 있으며, 나에게 완전히 새로운 것을 가르쳐 주신 것에 감사드립니다! – BrainStone