2010-02-25 24 views
5

MySQL hiện không hỗ trợ cập nhật các hàng trong cùng một bảng mà trình kích hoạt được gán cho vì cuộc gọi có thể trở thành đệ quy. Có ai có đề xuất về một giải pháp thay thế tốt/thay thế? Ngay bây giờ kế hoạch của tôi là gọi một thủ tục lưu trữ thực hiện logic mà tôi thực sự muốn kích hoạt, nhưng tôi rất thích nghe những người khác đã vượt qua giới hạn này như thế nào.Trình kích hoạt của MySQL không thể cập nhật các hàng trong cùng một bảng mà trình kích hoạt được gán cho. Giải pháp được đề xuất?

Chỉnh sửa: Một chút nền nữa theo yêu cầu. Tôi có một bảng lưu trữ các phân bổ thuộc tính sản phẩm. Khi một bản ghi sản phẩm cha mẹ mới được chèn vào, tôi muốn trình kích hoạt thực hiện chèn tương ứng trong cùng một bảng cho mỗi bản ghi con. Sự không chuẩn hóa này là cần thiết để thực hiện. MySQL không hỗ trợ điều này và ném:

Can't update table 'mytable' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. Thảo luận dài về vấn đề trên the MySQL forums về cơ bản dẫn đến: Sử dụng một proc đã lưu trữ, đó là những gì tôi đã làm bây giờ.

Cảm ơn trước!

+1

Vui lòng thêm một số chi tiết khác cho câu hỏi của bạn. Bạn đang cố gắng thực hiện những gì trong các bản cập nhật này? –

+0

Bạn đang cố gắng cập nhật các hàng khác với các hàng mà bản cập nhật chèn hoặc xóa chứa? – HLGEM

+0

Bạn đã bao giờ tìm thấy một giải pháp cho điều này? - Tôi cũng cần cập nhật nhiều hàng trong cùng một bảng khi một trong các hàng có một trường duy nhất được cập nhật? – crankshaft

Trả lời

1

Tôi cho rằng bạn có thể gọi cho proc được lưu trữ trong trình kích hoạt của mình. Tuy nhiên, nếu bạn muốn cập nhật một số trường trong cùng một bản ghi mà bạn đang thay đổi (chẳng hạn như cột được cập nhật hoặc lastupdated) thì bạn có thể làm điều này trong trình kích hoạt beofre theo hướng dẫn giới thiệu. http://dev.mysql.com/doc/refman/5.0/en/trigger-syntax.html

Đây là một hoạt động phổ biến cho trình kích hoạt và tôi thấy khó tin rằng nó không được hỗ trợ.

+0

Hoàn tác. Đáng buồn thay, tôi cần cập nhật hoặc chèn nhiều hàng trong cùng một bảng khi trình kích hoạt chạy. –

2

Bạn thực sự có thể tăng các hàng trong cùng một bảng làm trình kích hoạt. Chuỗi bạn liên kết thậm chí có giải pháp.

Ví dụ:

TestTable (id/lastmodified/random) 

create trigger insert_lastmod 
before insert on TestTable 
for each row 
set NEW.lastmodified = NOW(); 

insert into TestTable (`random`) values ('Random'); 

select * from TestTable; 
+----+---------------------+---------------------+ 
| id | lastmodified  | random    | 
+----+---------------------+---------------------+ 
| 1 | 2010-12-22 14:15:23 | Random    | 
+----+---------------------+---------------------+ 
+0

Tôi cần cập nhật hoặc chèn nhiều hàng trong cùng một bảng khi trình kích hoạt chạy. Trừ khi tôi nhầm thì điều này vẫn không được hỗ trợ. –

+0

Ví dụ ở trên cập nhật cùng một bảng khi kích hoạt chèn kích hoạt. – Ryaner

+10

Bạn đang thao tác chỉ các hàng vừa được chèn vào. Câu hỏi này là về thao tác với các hàng hiện có khác trong bảng khi một hàng đã cho được chèn vào. –

0

Nếu bạn muốn cập nhật cột mà bạn không đọc chức năng kích hoạt, sau đó là một cách giải quyết, bạn có thể đặt cột vào bảng riêng biệt.

-2

Bạn thực sự có thể làm điều đó dưới đây là một ví dụ cho cùng

DELIMITER $$ 
create trigger test2 
before insert on ptrt 
for each row 
begin 
if NEW.DType = "A" then 
set NEW.PA = 500; 

elseif NEW.DType = "B" then 
set NEW.PA = 1000; 

else 
set NEW.PA = 0; 
END IF; 
END;$$ 

DELIMITER; 
-3

này đã làm việc cho tôi: D

On Trước/Update.

BEGIN 
SET NEW.DateTimeUpdated = NOW(); 
END 
+0

Điều này không hoạt động đối với nhiều giá trị trên cùng một cột như câu hỏi mong muốn. – mikkeljuhl

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