2011-01-20 7 views
24

Tôi đang tìm cách tạo một kích hoạt MySQL trên một bảng. Về cơ bản, tôi đang tạo luồng hoạt động và cần phải ghi lại hành động của người dùng. Khi người dùng đưa ra nhận xét, tôi muốn kích hoạt cơ sở dữ liệu trên bảng đó để kích hoạt và:Làm thế nào để lập trình một trình kích hoạt MySQL để chèn hàng vào một bảng khác?

  1. Lấy ID của hàng được chèn cuối cùng (id của hàng nhận xét).
  2. thực hiện INSERT vào bảng hoạt động, sử dụng dữ liệu từ hàng được chèn cuối cùng.

Tôi sẽ sao chép cơ bản trình kích hoạt này để xóa nhận xét.

Câu hỏi tôi đã:

  1. là LAST_INSERT_ID() là cách tốt nhất để lấy id?
  2. Làm cách nào để lưu trữ đúng dữ liệu từ hàng nhận xét được chèn vào cuối cùng để sử dụng trong tuyên bố "INSERT vào hoạt động" của tôi?
  3. Tôi có nên sử dụng kết hợp các thủ tục được lưu trữ cũng như trình kích hoạt không?
  4. Cấu trúc cơ bản của trình kích hoạt sẽ trông như thế nào?

Cảm ơn! Đã một vài năm kể từ khi tôi chạm vào bất kỳ điều gì liên quan đến trình kích hoạt, thủ tục và chức năng của DB.

Trả lời

36
drop table if exists comments; 
create table comments 
(
comment_id int unsigned not null auto_increment primary key, 
user_id int unsigned not null 
) 
engine=innodb; 

drop table if exists activities; 
create table activities 
(
activity_id int unsigned not null auto_increment primary key, 
comment_id int unsigned not null, 
user_id int unsigned not null 
) 
engine=innodb; 

delimiter # 

create trigger comments_after_ins_trig after insert on comments 
for each row 
begin 
    insert into activities (comment_id, user_id) values (new.comment_id, new.user_id); 
end# 

delimiter ; 

insert into comments (user_id) values (1),(2); 

select * from comments; 
select * from activities; 

Edit:

mysql> \. d:\foo.sql 

Database changed 
Query OK, 0 rows affected (0.10 sec) 

Query OK, 0 rows affected (0.30 sec) 

Query OK, 0 rows affected (0.11 sec) 

Query OK, 0 rows affected (0.35 sec) 

Query OK, 0 rows affected (0.07 sec) 

Query OK, 2 rows affected (0.03 sec) 
Records: 2 Duplicates: 0 Warnings: 0 

+------------+---------+ 
| comment_id | user_id | 
+------------+---------+ 
|   1 |  1 | 
|   2 |  2 | 
+------------+---------+ 
2 rows in set (0.00 sec) 

+-------------+------------+---------+ 
| activity_id | comment_id | user_id | 
+-------------+------------+---------+ 
|   1 |   1 |  1 | 
|   2 |   2 |  2 | 
+-------------+------------+---------+ 
2 rows in set (0.00 sec) 
+7

Đối với tất cả tự hỏi những gì "mới" ở đây đang đứng cho: _You có thể tham khảo các cột trong bảng đề (bảng liên quan đến việc kích hoạt) bằng cách sử dụng các bí danh OLD và NEW. OLD.col_name đề cập đến một cột của một hàng hiện có trước khi nó được cập nhật hoặc xóa. NEW.col_name đề cập đến cột của hàng mới sẽ được chèn hoặc hàng hiện tại sau khi được cập nhật._ http://dev.mysql.com/doc/refman/5.0/en///create-trigger.html – SimonSimCity

+0

@ f00, bạn có thể vui lòng cho tôi biết trong trình kích hoạt này ... vì có mệnh đề 'cho mỗi hàng' nó sẽ quét toàn bộ bảng hay chỉ chèn các hàng mới. Cảm ơn sự giúp đỡ của bạn – SAM

+1

@SAM, "cho mỗi hàng" chỉ xem xét các hàng được cập nhật/chèn vào theo tài liệu mysql. –