2014-05-23 87 views
0

我是SQL中的初學者。我在嵌入式系統上使用sqlite,QT。我想在這裏設置一個觸發器。觸發器是每當主鍵Id大於32145時,應設置channelNum = 101。我想設置attrib的名字 - 也是文本,但是我得到了編譯問題。我相信觸發器的設置是DDL - 數據定義語言的一部分。請讓我知道,如果我在這裏錯了。這是我的創建數據庫代碼。我得到的SQL查詢錯誤。也請建議如何設置文本 - attrib =「COmedy」。爲什麼在sqlite中觸發查詢失敗 - QT在這裏 - ?

/** associate db with query **/ 
     QSqlQuery query (m_demo_db); 
     /** Foreign keys are disabled by default in sqlite **/ 
     /** Here is the pragma to turn them on first **/ 
     query.exec("PRAGMA foreign_keys = ON;"); 
     if (false == query.exec()) 
     { 
      qDebug()<<"Pragma failed"; 
     } 
     /** Create Table for storing user preference LCN for DTT **/ 
     qDebug()<<"Create Table postcode.db"; 
     query.prepare(" CREATE TABLE dttServiceList (Id INTEGER PRIMARY KEY, attrib varchar(20), channelNum integer)"); 
     if (false == query.exec()) 
     { 
      qDebug()<<"Create dttServiceList table failed"; 
     } 
     /** Try placing trigger here **/ 
     triggerQuery = "CREATE TRIGGER upd_check BEFORE INSERT ON dttServiceList \ 
       FOR EACH ROW \ 
       BEGIN \ 
       IF Id > 32145 THEN SET channelNum=101; \ 
       END IF; \ 
       END; "; 
     query.prepare(triggerQuery); 
     if (false == query.exec()) 
     { 
      qDebug()<<"Trigger failed !!"; 
      qDebug() << query.lastError(); 
     } 

此外,如何在觸發器中設置文本名稱 - 我想設置attrib =「喜劇」。我正在使用qt - sqlite。謝謝!爲您的答覆。

+0

ID是主鍵,我想你不能用這種方法。 –

+0

如果它沒有auto_incremented,並且您在插入查詢中傳遞了id,那麼請嘗試使用'IF NEW.Id>'而不是'Id>' –

回答

1

SQLite既沒有IF也沒有SET語句。

documentation所示,您只能在觸發器中使用UPDATE/INSERT/DELETE/SELECT語句。

整個觸發器的條件可以用WHEN子句實現。

您無法直接更改要插入的值;您必須事後更新該記錄:

CREATE TRIGGER upd_check 
AFTER INSERT ON dttServiceList 
FOR EACH ROW 
WHEN NEW.Id > 32145 
BEGIN 
    UPDATE dttServiceList 
    SET channelNum = 101 
    WHERE Id = NEW.Id; 
END; 
+0

如何在此指定文本 - attrib =「Comedy」 –

+0

閱讀[documentation] (http://www.sqlite.org/lang_update.html)。 –

+0

謝謝!我得到了答案。在這裏檢查。但是,我無法理解控制流程圖。 triggerQuery =「CREATE TRIGGER upd_check \ INSERT後dttServiceList \ FOR EACH ROW \ WHEN NEW.Id> 32145 \ BEGIN \ UPDATE dttServiceList \ SET channelNum = 101,屬性= '喜劇' \ 其中id = NEW .Id; \ END「; –