2013-10-29 4 views
0

세 번째 테이블의 값을 기반으로 두 번째 테이블 (B)에 여러 행을 만들거나 업데이트하기 위해 하나의 테이블 (A)에 행 삽입에 응답하려고합니다. (C) (처음에 합류 할 수 있음). 나는 건설 다음 한SQLite 트리거 여러 행을 여러 행 삽입/바꾸기

,

CREATE TRIGGER MyTrigger AFTER INSERT ON A 
    BEGIN 
     INSERT OR REPLACE INTO B (ID, T1, T2, Role) 
     VALUES 
     (
      (SELECT ID FROM C WHERE R1 = NEW.R1), 
      NEW.T1, 
      B.T2, -- The existing row's T2 
      (SELECT Role FROM C WHERE R1 = NEW.R1), 
     ) 
    END; 

Table A has columns ID, T1, R1 
Table B has columns ID, T1, T2, Role 
Table C has columns ID, R1, R2, Role 

나는 내가 교체에 B의 기존 값을 참조하는 방법을 모르는 트리거

  1. 를 구성에서 내 시도 적어도 두 가지 문제가 "B.T2"
  2. 표 B에서 INSERT/REPLACE를 수행 할 때 표 C의 같은 행에서 여러 열 (R1, 역할)을 참조하는 방법을 모르겠습니다.

이 문제를 해결해 주셔서 감사합니다.

+0

사용 'SELECT ... B FROM WHERE ROWID = NEW.ROWID' 대신'값 (...)' –

+0

당신은 더 나은 답을 작성하고 그것을 받아 들일 것! 열린 질문을 피하십시오. –

답변

1

SELECT에 LEFT OUTER JOIN을 사용하여 기존 행의 존재 여부에 관계없이 필요한 모든 값을 지정할 수있었습니다.

CREATE TRIGGER MyTrigger AFTER INSERT ON A 
    BEGIN 
     INSERT OR REPLACE INTO B (ID, T1, T2, Role) 
      SELECT 
       C.ID, 
       NEW.T1, 
       B.T2, 
       C.Role 
      FROM C LEFT OUTER JOIN B ON C.ID = B.ID WHERE C.R1 = NEW.R1; 
    END; 
1

VALUES 대신 SELECT 사용 :

CREATE TRIGGER MyTrigger AFTER INSERT ON A BEGIN 
    INSERT OR REPLACE INTO B (ID, T1, T2, Role) SELECT 
     (SELECT ID FROM C WHERE R1 = NEW.R1), 
     NEW.T1, 
     B.T2, 
     (SELECT Role FROM C WHERE R1 = NEW.R1) 
     FROM B WHERE ROWID=NEW.ROWID 
    END; 
+0

NEW가 A의 행을 참조하면 "FROM B WHERE ROWID = NEW.ROWID"가 실패 할 수 있습니까? 어쨌든, 나는 상수 값을 선택한 곳을 포함하여 그 형태로 SELECT를 작동시킬 수 없다. VALUES 형식을 사용하는 직선 상수 삽입 트리거가 제대로 작동했지만 테스트 도구 만 검사합니다. 나는 아직도 나열된 두 가지 문제로 곤란하다. 012.Burow.''가 'A.rowid'와 같은 이유는 무엇입니까? – JBJB

+0

그리고 새로 INSERT 된'A' 레코드의 경우,'NEW.rowid'는'B'에서 절대로 발견되지 않을 것입니다. 그래서 외부 SELECT는 아무것도 반환하지 않을 것입니다. –

0

C으로하고있는 같은 단지 하위 쿼리를 사용 B 기록을 찾을 수 있습니다. B.ID 검색 할 값은 삽입하려는 값과 같습니다.

CREATE TRIGGER MyTrigger 
AFTER INSERT ON A 
BEGIN 
    INSERT OR REPLACE INTO B (ID, T1, T2, Role) 
    VALUES 
    (
     (SELECT ID FROM C WHERE R1 = NEW.R1), 
     NEW.T1, 
     (SELECT T2 FROM B WHERE ID = (SELECT ID FROM C WHERE R1 = NEW.R1)), 
     (SELECT Role FROM C WHERE R1 = NEW.R1) 
    ); 
END; 
+0

올바른 방향으로 나아가는 한 걸음, 제대로 된 모양의 단일 레코드입니다. 이제는 테이블 C에서 여러 행이 포함 된 경우를 처리 할 수 ​​있어야합니다. 즉, 트리거와 관련된 두 번째 문제입니다. 즉, 제 테스트 케이스는 C에 두 개의 행이 있습니다. 여기서 R1 = NEW.R1입니다. 지금은 C의 첫 번째 행에 대해 B 행에 삽입 된 행만 가져옵니다. 내부 SELECT가 단일 값만 제공한다고 가정 할 때 완벽한 의미가 있습니다. 그래서 나는 SQLite가 첫 번째 값을 반환한다고 가정합니다. – JBJB

관련 문제