2010-07-12 33 views
5

Tôi đang làm việc để thiết lập một cơ sở dữ liệu SQLite đơn giản để truy cập thông qua Python. Cho đến nay tôi có một bảng cơ bản và một vài trigger - tôi muốn có một trigger cập nhật một cột field 'date_added' khi một bản ghi mới được thêm vào, và một cái khác để cập nhật một cột 'date_updated' khi một bản ghi được cập nhật sau . Đây là cú pháp SQLite của tôi cho trigger:sqlite UPDATE kích hoạt kích hoạt trên báo cáo INSERT cũng?

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; 

Các 'add_contact' cò vẻ là làm việc tốt ... nó kích hoạt khi tôi thêm một kỷ lục mới thông qua một lệnh INSERT sql, theo kế hoạch.

Vấn đề có vẻ là 'update_contact' cò ... nó cháy cả khi tôi cập nhật một kỷ lục qua một lệnh sql UPDATE (theo kế hoạch) khi tôi thêm một kỷ lục mới cũng:

tức khi tôi thêm một kỷ lục mới tôi có được điều này trong các cột 'date_updated' 'DATE_ADDED' và:

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

và khi tôi cập nhật hồ sơ đó, nó thay đổi như sau:

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

Tôi đoán tôi không nhận được lý do tại sao kích hoạt UPDATE bắn vào INSERT cũng?

TIA,

Monte

Edited thêm: Bất kỳ gợi ý về cách làm cho nó hoạt động như mong đợi?

Trả lời

6

Bạn có UPDATE trong trình kích hoạt INSERT của mình. Vì vậy, INSERT gây ra một UPDATE. Mà bạn đã nối với một kích hoạt khác nhau.

+0

Rất tiếc! Tôi hiểu ý của bạn là gì) Bất kỳ ý tưởng nào về cách đạt được mục tiêu ban đầu của hai bộ kích hoạt riêng biệt, một cái kích hoạt trên một INSERT và một cái sẽ kích hoạt vào CẬP NHẬT? Có vẻ như nếu có cách kích hoạt trình kích hoạt 'update_contact' trên bản cập nhật của bất kỳ trường nào * ngoại trừ * date_added, bạn nên làm như vậy. Chỉ cần không chắc chắn làm thế nào để đi về nó ... – memilanuk

+1

@memilanuk: Bạn có thể so sánh OLD.date_added để NEW.date_added trong kích hoạt UPDATE của bạn? – Borealid

+1

Chỉ là một bản cập nhật trên một chủ đề cũ, như tôi đã nhận xung quanh để tinkering với mã trong câu hỏi một lần nữa ngày hôm nay. Tôi đã thay đổi mã kích hoạt để đọc: CẬP NHẬT contact_info SET date_updated = DATETIME ('NOW') WHERE pkid = new.pkid VÀ DATETIME ('NOW')! = Date_added; Dường như hoạt động. Cảm ơn bạn đã di chuyển đúng hướng! – memilanuk

8

Cách tốt hơn để tránh vấn đề ban đầu là sử dụng mệnh đề DEFAULT (DATETIME('NOW')) cho cột date_added trong định nghĩa bảng, thay vì sử dụng kích hoạt INSERT.

+2

Và đảm bảo rằng các câu lệnh * no * INSERT bao gồm cột date_added. SQLite3 dường như không thực thi mệnh đề DEFAULT khi NULL được chèn vào cho một cột đã cho. –

Các vấn đề liên quan