2010-07-12 4 views
5

파이썬을 통해 액세스 할 수있는 간단한 SQLite 데이터베이스를 설정하고 있습니다. 지금까지 기본 테이블과 트리거가 두 개 있습니다. 하나의 트리거가 새 레코드가 추가 될 때 'date_added'필드 열을 업데이트하고 나중에 레코드가 업데이트 될 때 'date_updated'열을 업데이트하려고합니다. . 여기에 트리거에 대한 내 SQLite는 구문입니다sqlite UPDATE 트리거가 INSERT 문에서도 실행됩니까?

CREATE TRIGGER add_contact AFTER INSERT ON contact_info 
BEGIN 
    UPDATE contact_info SET date_added = DATETIME('NOW') WHERE pkid = new.pkid; 
END; 

CREATE TRIGGER update_contact AFTER UPDATE ON contact_info 
BEGIN 
    UPDATE contact_info SET date_updated = DATETIME('NOW') WHERE pkid = new.pkid; 
END; 

'add_contact'트리거가 잘 동작하는 것이 계획대로 내가는 SQL INSERT 명령을 통해 새 레코드를 추가 할 때 ...이 발생합니다.

문제는 화재 ... 'update_contact'트리거 것 같다 모두 나는 또한 새로운 기록을 추가 할 때 I는 SQL UPDATE 명령을 통해 (계획대로) 을 레코드를 업데이트 할 때 :

2010-07-12 05:00:06|2010-07-12 05:00:06 

을 내가 그 기록을 업데이트 할 때, 그것과 같이 변경합니다 : 나는 새 레코드를 추가 할 때 나는 'DATE_ADDED'와 'date_updated'열이 얻을

2010-07-12 05:00:06|2010-07-12 05:14:26 
,

나는 INSERT에서 왜 UPDATE 트리거도 발생시키지 않는다고 생각하니?

TIA,

몬테

편집 추가하는 방법 : 의도 한대로 작동하도록에 대한 어떤 힌트를?

답변

6

INSERT 트리거에 UPDATE가 있습니다. 따라서 INSERT는 UPDATE를 발생시킵니다. 다른 방아쇠를 당긴 당신.

+0

웁스! 나는 당신이 의미하는 것을 본다;) INSERT에서 발생하는 하나의 트리거와 UPDATE에서 발생하는 두 개의 개별 트리거의 원래 목표를 달성하는 방법을 알고 싶습니까? 'date_added'를 제외한 모든 필드 업데이트에 'update_contact'트리거를 발생시키는 방법이있는 것처럼 보입니다. 그렇게해야합니다. 그냥 그것에 대해 가야할지 모르겠다 ... – memilanuk

+1

@ memilanuk : 당신은 OLD.date_added를 UPDATE 트리거의 NEW.date_added와 비교할 수 있습니까? – Borealid

+1

이전 스레드의 업데이트만으로도 문제의 코드를 다시 고칠 수있었습니다. 트리거 코드를 다음과 같이 변경했습니다. UPDATE contact_info SET date_updated = DATETIME ('NOW') 여기서 pkid = new.pkid AND DATETIME ('NOW')! = date_added; 작동하는 것으로 보입니다. 올바른 방향으로 움직여 주셔서 감사합니다! – memilanuk

8

원본 문제를 방지하는 더 좋은 방법은 INSERT 트리거를 사용하는 대신 테이블 정의의 date_added 열에 DEFAULT (DATETIME('NOW')) 절을 사용하는 것입니다.

+2

그리고 * no * INSERT 문에 date_added 열이 포함되어 있는지 확인하십시오. 주어진 열에 NULL이 삽입되면 SQLite3은 DEFAULT 절을 실행하지 않는 것 같습니다. –

관련 문제