2012-02-20 14 views
9

: I (varsayılan değer ayarlayabilirsiniz) veritabanı yapısını değiştiremez where can be only select/insert/update/delete stmt. New.t işe yaramadıTetikleyiciyi sqlite'e yerleştirmeden önce Yeni'yi güncelleyebilir miyim? Örneğin

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. Tetikleyiciyi ekledikten sonra "null" kısıtlaması nedeniyle de uygun değildir. buldum tek çözüm:

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

test veritabanı yalnızca bilgi amaçlıdır, uygulamada hesaplanan verilerle daha karmaşık durumlar vardır. Bunun gibi bir şey olabilir "Yeni set New.t = şimdi()", veya değil güncelleme?

+0

INSTEAD OF tetikleyicili bir görünüm oluşturabilir ve bunun yerine görünüme ekleyebilir misiniz? –

+0

Ayrıca kararın bir çeşidi, ancak sorunu çözmüyor. Benim durumumda tablolar senkronizasyon sürecinde oluşturulur. Sonra herhangi bir ddl çalıştırabilirim. – lunicon

+0

Ana veritabanı modelinde ayrıca set stmt ile tetikleme kullanılır. Görünümü oluşturabilirim, ancak değiştirip programlayacağım (eğer yapabilirsem ...) – lunicon

cevap

6

Hayır, YENİ'yi güncelleyemezsiniz.

Yapmak istediklerim, kısa bir yorumda bulunulduğu için INSTEAD OF tetikleyicili bir GÖRÜNÜM kullanmanızdır. Bilginize

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; 

sizin id kolon gerektiğini,: NEW.t etkilenen satırın (ler) de t güncellemek için IS NULL ZAMAN Senin durumunda

iyi çözüm INSERT/UPDATE tetikleyicisi SONRA bir kullanımı olabilir Muhtemelen INTEGER PRIMARY KEY ... olarak bildirilebilir ...

+0

"Null değil" kısıtlaması nedeniyle bu seçeneği uygun değilim - insert null :(PS ile başarısız oldu ve yeni gelenler, güncelleme daha iyi kullanın ... olmamalıdır nerede rowid = new.rowid – lunicon

+0

Peki, bu tetik var verilmiş t NULL olmayacak, yani bu kısıtlamayı kaldırabiliyorsunuz ... Rowid'e gelince ... bunu ima ettim, ama yeni gelenlerin ipucu almayacağı konusunda haklısınız.Öte yandan, tüm RDBMS'ler daima sıralı .. Evet, SQLite3 temelde her zaman bir satırbaşı var, _but_ 'INTEGER PRIMARY KEY olmayan' rowid 'adında sütunlar olabilir, bu yüzden size açık bir INTEGER PRIMARY KEY' inizin olmasını tavsiye etmenin daha güvenli olacağını düşündüm. – Nico

İlgili konular