2013-02-08 37 views
8

Vì vậy, tôi có một bảng MySQL, tên nhân viên.MySQL TRƯỚC KHI CẬP NHẬT CẬP NHẬT - giá trị thay đổi

ID name meta 
0  jack ok 
1  anne del 

Tôi muốn viết trình kích hoạt ngăn cản hàng meta = 'del' cập nhật trường meta. Vì vậy, nếu tôi làm:

UPDATE employees SET meta = 'busy' WHERE ID = 0 

Hàng cần được cập nhật và meta sẽ là 'bận rộn'

Nhưng khi tôi làm:

UPDATE employees SET meta = 'busy' WHERE ID = 1 

Trường meta vẫn nên 'del '

tôi đã cố gắng:

delimiter $$ 
CREATE TRIGGER updateEmployees 
BEFORE UPDATE ON employees 
FOR EACH ROW 
BEGIN 
    IF OLD.meta = 'del' THEN 
     NEW.meta = 'del' 
    END IF; 
END$$ 
delimiter ; 

Nhưng MySQL trả về với lỗi cú pháp. Bất kỳ ý tưởng?

Trả lời

3

bạn bỏ lỡ ;

delimiter $$ 
CREATE TRIGGER updateEmployees 
BEFORE UPDATE ON employees 
FOR EACH ROW 
BEGIN 
    IF OLD.meta = 'del' THEN 
     NEW.meta = 'del'; -- << here 
    END IF; 
END$$ 
delimiter ; 

TRIGGER LÀ EVIL.

Một thay thế để kích hoạt là bằng cách thêm một điều kiện AND

UPDATE employees 
SET meta = 'busy' 
WHERE ID = 1 AND meta <> 'del' 
+0

Trình kích hoạt vẫn không hoạt động nhưng tôi đã quyết định sử dụng giải pháp thứ hai của bạn. Cảm ơn bạn! –

+0

bạn được chào đón ': D' –

+14

Tại sao TRIGGER lại là ác? Nó là một công cụ rất mạnh mẽ mà quản trị cơ sở dữ liệu có thể sử dụng để thực thi các quy tắc toàn vẹn dữ liệu. Trong một môi trường mà tính toàn vẹn dữ liệu là tối quan trọng (các bản ghi công ty chẳng hạn) Trình kích hoạt cung cấp một nguồn tài nguyên có giá trị để thực thi điều đó, ngay cả trên các nhà phát triển ứng dụng. Tôi sử dụng kích hoạt ngay cả trong sự phát triển cá nhân của tôi khi họ thực thi toàn vẹn dữ liệu cho tôi với chi phí hiệu năng nhỏ, mà sẽ bị mất đi bởi ứng dụng thực hiện kiểm tra tương tự ... – lassombra

16

Bạn quên thêm mệnh đề SET. Bằng cách này, nó không thực sự thay đổi giá trị.

delimiter $$ 
CREATE TRIGGER updateEmployees 
BEFORE UPDATE ON employees 
FOR EACH ROW 
BEGIN 
    IF OLD.meta = 'del' THEN 
     SET NEW.meta = 'del'; 
    END IF; 
END$$ 
delimiter ; 
Các vấn đề liên quan