2011-10-06 5 views
0

이 내가 할 수 무엇을해야 내 테이블MySQL은 자동으로

CREATE TABLE IF NOT EXISTS `carslibrary` (
     `CarID` int(10) unsigned NOT NULL AUTO_INCREMENT, 
     `CarName` varchar(255) NOT NULL, 
     PRIMARY KEY (`CarID`) 
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ; 

    CREATE TABLE IF NOT EXISTS `colorslibrary` (
     `ColorID` int(11) unsigned NOT NULL AUTO_INCREMENT, 
     `ColorName` varchar(255) NOT NULL, 
     PRIMARY KEY (`ColorID`) 
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ; 


    CREATE TABLE IF NOT EXISTS `facerecord` (
     `carslibrary_ID` int(10) unsigned NOT NULL, 
     `colorslibrary_ID` int(11) unsigned NOT NULL, 
     KEY `carslibrary_ID` (`carslibrary_ID`), 
     KEY `colorslibrary_ID` (`colorslibrary_ID`) 
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

내가 carslibrary 표 안에 자동차 레코드를 추가 할 때 자동으로 업데이트되지 않습니다 facerecord 테이블 내부 carslibrary_ID 속성을 발견한다 에?

+1

정보가 1/2 밖에없는 경우 자동차 라이브러리 레코드를 삽입 할 때 facerecord에 자동으로 레코드를 추가 할 수 있습니까?나에게 facerecord 테이블은 자동차 -> 색상의 관계 테이블처럼 보입니다. – Geoffrey

+0

colorslibrary_ID는 동안 carslibrary_ID해야하지 –

답변

4

먼저 carslibrary 테이블에 삽입 할 때 '알지 못하므로'facerecord.colorslibrary_ID에 지정된 기본값이 있어야합니다.

CREATE TABLE `facerecord` (
`carslibrary_ID` int(10) unsigned NOT NULL, 
`colorslibrary_ID` int(10) unsigned NOT NULL DEFAULT '0', 
KEY `carslibrary_ID` (`carslibrary_ID`), 
KEY `colorslibrary_ID` (`colorslibrary_ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

가 나는 또한 당신이 이제까지 외부 키를 설정 같은 느낌이 경우에 colorslibrary.ColorID 열의 일치하도록 colorslibrary_ID 열의 데이터 유형을 변경했습니다 : 즉, facerecord 테이블이 될 수 있도록 당신이 당신의 DDL을 변경할 수 있다고 말했다 facerecord.colorslibrary_IDcolorslibrary.ColorID 사이). 완성도를 위해서 당신은 그러므로 ColorID = 0과 colorslibrary 테이블에 행을 삽입해야합니다

다음
insert into `colorslibrary` (ColorName) values ('unknown color'); 

update `colorslibrary` set ColorID = 0 where ColorName = 'unknown color'; 

는 계속 진행하여 facerecord 테이블에 삽입하는 트리거를 정의 할 수 있습니다 :

delimiter $$ 

CREATE TRIGGER carslibrary_trigger 
    AFTER insert ON carslibrary 
    FOR EACH ROW 
    BEGIN 
     insert into facerecord (carslibrary_ID) values (new.CarID); 
END$$ 

delimiter; 

facerecord 테이블에 삽입 된 모든 새로운 행은 '알 수없는 색'colorslibrary.ColorName과 관련된 colorslibrary_ID으로 삽입됩니다. 그러면 알고있을 때 수동으로 facerecord.colorslibrary_ID을 업데이트 할 수 있습니다.

행운을 빈다.

당신이 먼저 기존의 트리거를 찾아 당신이 그렇게 할 수있는 carslibrary 테이블에서 기존 AFTER insert 트리거를 제거해야하는 경우 이

PS가 :

select trigger_name 
from information_schema.triggers 
where event_object_table = 'carslibrary' 
and action_timing = 'AFTER' 
and event_manipulation= 'INSERT'; 

그런 다음 위의 문에 의해 반환 된 트리거의 이름을을 (할 수 있습니다 'carslibrary_trigger'가 반환되는 문자열)을 말하고 실행

다음
drop trigger carslibrary_trigger; 

CREATE TRIGGER 스크립트를 다시 실행합니다.

일단 트리거가 설정되면 지정한 트리거 동작이 발생할 때 지정한 동작이 자동으로 수행됩니다. 이 경우 우리는 데이터베이스에 "facerecord.carslibrary_ID 열을 채우는 carslibrary 행의 CarID 행을 사용하여 carslibrary 테이블에 삽입이 자동으로 행을 삽입하여"facerecord 테이블에 행을 삽입 한 후 데이터베이스에 알립니다. " 대부분의 것들과 마찬가지로 가장 좋은 방법은 그것을 시도하는 것입니다! 방아쇠를 수동으로 만들면 수동으로 새 행을 'carslibrary table. Now look at the data in the facerecord` 테이블에 삽입합니다. 트리거 실행에 의해 삽입 된 새 행이 표시됩니다.

트리거에 대해 학습하면 도움이 될 것 같습니다. 이 답변은 방법이기 때문에 나는 처음에 그것을 의도했다는 이유로 MySQL site에서 문서를 추천합니다!

+0

+1 매우 포괄적 인 답변을 수동으로 업데이트됩니다. – Johan

+0

실제로 어떻게 트리거를 사용합니까? 내가 SQL 텍스트 영역에 붙여 내가 오류가 점점 오전 : MySQL은 말했다 : # 1235 이 - MySQL의이 버전은 아직 '하나 개의 테이블에 동일한 동작 시간 및 이벤트 여러 트리거'를 지원하지 않습니다 –

+0

이미 같은 소리 carslibrary 테이블에 삽입하도록 트리거를 설정하십시오. 위의 트리거를 설정하려면 이러한 항목을 삭제해야합니다. 나는 당신을 위해 좀 더 많은 정보를 가지고 나의 대답을 수정했다. –