2011-07-20 38 views
6

tôi cũng đã tìm kiếm rất nhiều nơi trên internet cho nguyên nhân của mysql error #1442 mà nóinguyên nhân thực sự của lỗi mysql 1442 là gì?

Không thể cập nhật bảng 'unlucky_table' trong lưu trữ chức năng/kích hoạt vì nó đã được sử dụng bởi tuyên bố đó đã viện dẫn chức năng/kích hoạt được lưu trữ

một số người nói rằng đây là lỗi trong mysql hoặc tính năng mà nó không cung cấp.

MySQL triggers can't manipulate the table they are assigned to. All other major DBMS support this feature so hopefully MySQL will add this support soon.

Một số cho rằng điều này là do hành vi đệ quy when you insert a record mysql is doing some lock stuff. you can't insert/update/delete rows of the same table where you insert.. because then the trigger would called again and again.. ending up in a recursion

During the insert/update you have access to the NEW object which contains all of the fields in the table involved. If you do a before insert/update and edit the field(s) that you want to change in the new object it will become a part of the calling statement and not be executed as a separately (eliminating the recursion)

bây giờ tôi không thể hiểu tại sao điều này là đệ quy. tôi có một trường hợp trong đó tôi có 2 bảng table1table2 và tôi chạy một truy vấn sql như

update table1 set avail = 0 where id in (select id from table2 where duration < now() - interval 2 hour); 

bây giờ tôi có một after update trigger trên table1 như

CREATE TRIGGER trig_table1 AFTER UPDATE ON table1 
FOR EACH ROW begin 
if old.avail=1 and new.avail=0 then 
delete from table2 where id=new.id; 
end if; 

bây giờ khi tôi thực hiện cập nhật truy vấn tôi gặp lỗi 1442. những gì đệ quy trong trường hợp này?

is this error a lack of feature in mysql? 
OR 
does this have to do with how mysql executes queries? 
OR 
is there something logically wrong with executing such queries? 

Trả lời

4

Bạn không thể tham chiếu đến bảng khi cập nhật bảng.

/* my sql does not support this */ 
UPDATE tableName WHERE 1 = (SELECT 1 FROM tableName) 

Từ MySQL Docs:

Một cò thể truy cập cả dữ liệu cũ và mới trong bảng riêng của mình. Trình kích hoạt cũng có thể ảnh hưởng đến các bảng khác, nhưng không được phép sửa đổi một bảng đã được sử dụng (để đọc hoặc viết) bằng câu lệnh đã gọi hàm hoặc trình kích hoạt. (Trước MySQL 5.0.10, trình kích hoạt không thể sửa đổi các bảng khác.)
+0

bảng UPDATE của nóName WHERE id in (SELECT id FROM tableName) – lovesh

+0

Tôi vừa nhận xét rằng bạn không thể chọn từ bảng bạn đang cập nhật. Nó không quan trọng những gì là ở nơi miễn là cùng một tablename của nó. Tôi đang tìm kiếm lý do tại sao kích hoạt đó không thành công ngay bây giờ. Nhưng tôi chắc chắn 99% ở trên là lý do tại sao nó không hoạt động. – BradLaney

+0

tôi biết nó không hoạt động đó là lý do tôi yêu cầu cho – lovesh

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