2011-11-17 42 views
6

Tôi đã tìm kiếm trên web cách sử dụng "trước khi kích hoạt" trong sqlite. Tôi biết đúng cách sử dụng "sau khi kích hoạt". Tôi tìm thấy một trong đó nói rằng "trước khi kích hoạt" đã được sử dụng để xác nhận trước khi bất kỳ thay đổi được thực hiện cho cơ sở dữ liệu (chèn/updat hàng trong bảng). Để xóa biểu thức, tôi đã viết trình kích hoạt trong đó loại trước và sự kiện được chèn để xác thực đánh dấu trước khi chèn. Trình kích hoạt của tôi làCách xác thực trước khi kích hoạt chèn trong sqlite

create trigger mark_insert before insert on exam 
when mark<=50 
begin 
insert into exam(mark) values(50); 
end; 

Có thể trình kích hoạt sai. Vì vậy, bạn có thể xin vui lòng chỉ cho tôi ra các lỗi trong đó? Tôi muốn kiểm tra nhãn hiệu cho dù nó nhỏ hơn hay bằng 50. Nếu vậy, tôi muốn chèn giá trị mặc định (trong trường hợp này là 50). Tôi không quen thuộc với sql và kích hoạt và bắt đầu học.

bảng thi của tôi có các cột sau,

id(pk) | subject | mark 

Trả lời

3

Nếu bạn muốn nâng cao một lỗi trên dữ liệu không hợp lệ, làm điều này:

CREATE TRIGGER trigger_validate_mark BEFORE INSERT ON exam 
WHEN mark<=50 
BEGIN 
    SELECT RAISE(ABORT,'Mark must be at least 50.'); 
END; 

Nếu bạn chỉ muốn sửa chữa các dữ liệu, thực hiện điều này :

CREATE TRIGGER trigger_min_mark AFTER INSERT ON exam 
WHEN mark<=50 
BEGIN 
    UPDATE exam 
    SET mark=50 
    WHERE id = new.id; 
END; 
+1

cảm ơn sự giúp đỡ của bạn. Nhưng tôi nhận được lỗi này: không có dấu cột nào. Có phải do tăng() không? Bạn có thể giải thích về chức năng nâng cao không? Cảm ơn bạn trước. – waiyan

+0

'tăng' là cách bạn tạo ra lỗi trong trình kích hoạt. http://www.sqlite.org/lang_createtrigger.html –

+0

Sau câu lệnh SELECT, ';' là bắt buộc. –

3

nếu bạn muốn kiểm tra nhãn hiệu liệu giá trị nhỏ hơn hoặc bằng 50

CREATE TRIGGER trigger_min_mark AFTER INSERT ON exam 
WHEN New.mark<=50 
BEGIN 
    UPDATE exam SET mark=50 WHERE id = New.id; 
END 

Hãy cẩn thận bạn vào báo cáo kết when bạn phải xác định New.ColumnName

4

gì về đảm bảo nó trong định nghĩa bảng?

CREATE TABLE exam (
    ... 
    CHECK(mark<=50) 
); 
Các vấn đề liên quan