2013-04-12 42 views
23

Vì vậy, tôi có hai bảng như thế này ...
MySQL kích hoạt On Insert/Cập nhật các sự kiện

ext_words 
------------- 
| id | word | 
------------- 
| 1 | this | 
------------- 
| 2 | that | 
------------- 
| 3 | this | 
------------- 

ext_words_count 
--------------------- 
| id | word | count | 
--------------------- 
| 1 | this | 2 | 
--------------------- 
| 2 | that | 1 | 
--------------------- 

tôi đang cố gắng để tạo ra một kích hoạt mà sẽ:

  • cập nhật ext_words_count.count khi ext_words.word được cập nhật .

Để làm phức tạp thêm vấn đề,

  • nếu ext_words.word không tồn tại trong ext_words_count khi ext_words được cập nhật, tôi muốn chèn nó vào ext_words_count và thiết lập count như 1.

tôi đã xem xét các câu hỏi tương tự:
1. Before/after insert trigger using auto increment field
2. Using Trigger to update table in another database
cố gắng để kết hợp 2. Dưới đây là những gì tôi có cho đến nay:

DELIMITER $$ 
CREATE TRIGGER update_count 
AFTER UPDATE ON ext_words 
FOR EACH ROW 
BEGIN 

    UPDATE ext_words_count 
    SET word_count = word_count + 1 
    WHERE word = NEW.word; 

END; 
$$ 
DELIMITER ; 

Bất cứ lời khuyên và hướng được đánh giá rất nhiều. Hoặc có thể là một phương pháp khác mà tôi đã bỏ qua và luôn cảm ơn trước!

UPDATE:
tôi đã chọn cho việc sử dụng 2 trigger, một cho INSERT và một cho UPDATE bởi vì tôi không phải là quen thuộc với câu điều kiện trong MySQL.

DELIMITER $$ 
CREATE TRIGGER insert_word AFTER INSERT ON ext_words 
    FOR EACH ROW 
    BEGIN 
     INSERT IGNORE INTO ext_words_count (word) VALUES (NEW.word); 
    END; 
$$ 
DELIMITER ; 

DELIMITER $$ 
CREATE TRIGGER update_word AFTER UPDATE ON ext_words 
    FOR EACH ROW 
    BEGIN 
     UPDATE ext_words_count 
     SET word_count = word_count + 1 
     WHERE word = NEW.word; 
    END; 
$$ 
DELIMITER ; 

Các truy vấn INSERT đang làm việc rất tốt, tuy nhiên truy vấn UPDATE không cập nhật word_count. Có cái gì tôi bị mất trong truy vấn cập nhật ..?

+3

Bạn có thể muốn xem này, [MySQL cháy Trình kích hoạt cho cả Chèn và Cập nhật] (http://stackoverflow.com/questions/1318224/mysql-fire-trigger-for-both-insert-and-update) Giải pháp của tôi có hoạt động không? Kết quả tôi muốn cải thiện là gì. Hãy nhớ rằng bạn không thể cập nhật cùng một bảng mà bạn gọi kích hoạt trong MySQL –

+0

@GrijeshChauhan - Cảm ơn bạn đã liên kết! Tôi không thể có được câu trả lời của bạn làm việc, nhưng đó là bởi vì tôi mới vào các câu lệnh có điều kiện trong MySQL, không phải vì giải pháp của bạn. – Drewness

+0

Tôi có nghĩa là khi ext_words được cập nhật, nếu từ đó không nằm trong ext_words_count thì tôi muốn chèn nó và tạo số đếm 1. Nếu không, nếu từ này nằm trong ext_words_count, hãy tăng số đếm lên 1 ... – Drewness

Trả lời

36

Với sự trợ giúp hoàn hảo của Grijesh và đề xuất của anh ấy để sử dụng câu lệnh có điều kiện, tôi có thể nhận được kích hoạt ONE kích hoạt thực hiện cả hai tác vụ. Cảm ơn một lần nữa Grijesh

DELIMITER $$ 
CREATE TRIGGER update_count AFTER INSERT ON ext_words 
FOR EACH ROW 
    BEGIN 
    IF NOT EXISTS (SELECT 1 FROM ext_words_count WHERE word = NEW.word) THEN 
     INSERT INTO ext_words_count (word) VALUES (NEW.word); 
    ELSE 
     UPDATE ext_words_count SET word_count = word_count + 1 WHERE word = NEW.word; 
    END IF; 
    END $$  
DELIMITER; 
+0

Vì vậy, biểu mẫu nào giúp bạn DB.exchange? –

+1

Không bao giờ được nghe từ bất cứ ai. : (Tôi chỉ duyệt qua một số bài viết. Cảm ơn bạn lần nữa vì tất cả sự giúp đỡ của bạn và chỉ cho tôi đến trang web khác! – Drewness

+1

Trình kích hoạt này hoạt động tuyệt vời trong máy chủ MySQL của tôi để lọc ra chèn thừa. – Kiwi

3

tránh sử dụng các từ khóa như tính là nó được sử dụng theo phương pháp sql một số thời gian của mình tạo ra lỗi nhưng một số chạy tốt

DELIMITER $$ 
CREATE TRIGGER update_count 
    AFTER UPDATE ON ext_words 
    FOR EACH ROW 
     BEGIN 

      SELECT count INTO @x FROM ext_words_count LIMIT 1; 
      UPDATE ext_words_count 
      SET count = @x + 1 
      WHERE word = NEW.word; 

END; 
$$ 
DELIMITER ; 
Các vấn đề liên quan