为什么在sqlite中触发查询失败 - QT在这里 - ?

时间:2014-05-23 10:02:25

标签: c++ mysql sql qt sqlite

我是SQL的初学者。我在嵌入式系统上使用sqlite,QT。我想在这里设置一个触发器。触发器是每当主键Id大于32145时,应设置channelNum = 101。我想设置attrib名称 - 文本,但我得到了编译问题。我认为触发器的设置是DDL的一部分 - 数据定义语言。如果我错了,请告诉我。这是我的创建db代码。我得到sql查询错误。另外请建议如何设置文本 - attrib =" COmedy"。

/** 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 =&#34;喜剧&#34;。我正在使用qt - sqlite。谢谢!你的回复。

1 个答案:

答案 0 :(得分: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;