2012-02-20 32 views
9

Ví dụ:Tôi có thể cập nhật Mới vào trước khi chèn trình kích hoạt trong sqlite không?

create table test (id numeric, t date not null); 

create trigger test_in 
before insert on test 
for each row 
when New.t is null 
begin 
-- set New.t = now(); 
end; 

Set New.t đã không làm việc, where can be only select/insert/update/delete stmt. tôi không thể thay đổi cấu trúc cơ sở dữ liệu (có thể thiết lập giá trị mặc định). Sau khi chèn kích hoạt cũng không phù hợp vì "không null" hạn chế. Giải pháp duy nhất tôi đã tìm thấy:

insert into test values (New.id, now()); 
select raise(ignore); 

cơ sở dữ liệu thử nghiệm cho mục đích minh họa mà thôi, trong thực tế có những trường hợp phức tạp hơn với các dữ liệu tính toán. Có thể có một cái gì đó như thế này "cập nhật New set New.t = now()", hay không?

+0

Bạn có thể tạo chế độ xem bằng trình kích hoạt INSTEAD OF và chèn vào chế độ xem thay thế không? –

+0

Nó cũng là một biến thể của quyết định, nhưng không giải quyết được vấn đề. Trong trường hợp bảng của tôi được tạo trong quá trình đồng bộ hóa. Tôi có thể chạy bất kỳ ddl sau. – lunicon

+0

Trong mô hình cơ sở dữ liệu chính cũng được sử dụng kích hoạt với tập hợp lệnh. Tôi có thể tạo chế độ xem, nhưng sẽ phải thay đổi và lập trình (nếu tôi có thể ...) – lunicon

Trả lời

6

Không, bạn không thể cập nhật MỚI.

Điều tôi có xu hướng làm là sử dụng VIEW với bộ kích hoạt INSTEAD OF vì mu được nhận xét ngắn.

Trong trường hợp của bạn giải pháp tốt nhất có thể sử dụng một SAU INSERT/UPDATE kích hoạt KHI NEW.t IS NULL để cập nhật t trong hàng bị ảnh hưởng (s):

CREATE TRIGGER test_in 
AFTER INSERT ON test 
FOR EACH ROW 
WHEN (NEW.t IS NULL) 
BEGIN 
    UPDATE test SET t = now() WHERE id = NEW.id; 
END; 

FYI, cột id bạn nên có thể được khai báo là TỪ CHẤT CHÍNH THỨC ...

+0

Tôi không phù hợp với tùy chọn này vì hạn chế "không null" - chèn không thành công bằng null: (PS và không nên nhầm lẫn người mới, cập nhật sử dụng tốt hơn ... trong đó rowid = new.rowid – lunicon

+0

Vâng, với điều kiện bạn có trình kích hoạt này t sẽ không được NULL, vì vậy bạn có thể thả ràng buộc đó.Đối với rowid ... tôi ám chỉ rằng, nhưng bạn nói đúng rằng người mới có thể không nhận được gợi ý.Trên một mặt khác, không phải tất cả RDBMS luôn có rowid .. Có, SQLite3 về cơ bản luôn luôn có một rowid, _but_ bạn có thể có các cột có tên là 'rowid' không phải là PRIMARY KEY INTEGER, vì vậy tôi cảm thấy nó sẽ an toàn hơn để khuyên bạn nên có một INTIMER PRIMARY KEY rõ ràng. – Nico

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