2012-03-16 10 views
8

Tôi muốn sử dụng ràng buộc CHECK trong MySQL, nhưng nó không được hỗ trợ. (Không giống như các RDBMS khác, nó sẽ hiểu nhưng không thực thi KIỂM TRA.)Trình kích hoạt MySQL có thể mô phỏng ràng buộc CHECK không?

Tôi đã thấy một số cách giải quyết với trình kích hoạt. Nhưng chúng có xu hướng đặt giá trị mặc định cho trường được đề cập thay vì trả về lỗi.

Có thể xây dựng trình kích hoạt trả về lỗi nếu điều kiện không được đáp ứng không?

Cuối cùng tôi muốn kích hoạt sao chép ràng buộc CHECK.

+0

Hạn chế 'CHECK' của bạn chính xác là gì? Một loại ràng buộc kiểm tra cụ thể có thể được mô phỏng bằng các ràng buộc khóa ngoài. –

+0

nó có thể có được một kích hoạt để ném và lỗi nếu hạn chế FK không phải là những gì bạn đang sau. Hãy xem xét điều này: http://stackoverflow.com/questions/24/throw-an-error-in-mysql-trigger –

+0

Để @ypercube: có thể là một cái gì đó như TẠO TABLE thử nghiệm ( \t id INT PRIMARY KEY , \t số INT, \t KIỂM TRA (số> 0) ); – smnsvane

Trả lời

2

Hãy thử cú pháp sau

CREATE TRIGGER mytabletriggerexample 
BEFORE INSERT 
FOR EACH ROW BEGIN 
IF(NEW.important_value) < (fancy * dancy * calculation) THEN 
    DECLARE dummy INT; 

    SELECT Your meaningful error message goes here INTO dummy 
     FROM mytable 
     WHERE mytable.id=new.id 
END IF; END; 
7

Từ MySQL 5.5 trở đi, bạn có thể sử dụng cú pháp SIGNAL để trả về lỗi từ các thủ tục được lưu trữ như trình kích hoạt.

12

khi bạn đang cập nhật dữ liệu:

delimiter $$ 
create trigger chk_stats1 before update on stats 
    for each row 
    begin 
    if new.month>12 then 
     SIGNAL SQLSTATE '45000' 
     SET MESSAGE_TEXT = 'Cannot add or update row: only'; 
     end if; 
     end; 
     $$ 

khi bạn đang chèn dữ liệu:

delimiter $$ 
    create trigger chk_stats before insert on stats 
     for each row 
     begin 
     if new.month>12 then 
     SIGNAL SQLSTATE '45000' 
     SET MESSAGE_TEXT = 'Cannot add or update row: only'; 
     end if; 
    end; 
    $$ 

những kích hoạt sẽ làm việc như ràng buộc kiểm tra, làm việc trước khi chèn hoặc cập nhật và kiểm tra tháng, nếu tháng> 12 cho lỗi.