我正在尝试开发一个跨平台的C程序,它可以进行简单的SQLite数据库管理。它只是创建一些表,触发器,然后定期插入记录。
我遇到的问题是我通过直接使用SQL命令调用sqlite3_exec来尝试以编程方式创建触发器时出现语法错误。有趣的是,我的程序在Windows中运行良好。它成功创建/删除触发器。但是在Linux(Ubuntu)上运行时出现以下语法错误。
Info: connecting device...
Info: Opened database ./test.db successfully
Info: operation done successfully
Error: Time:Fri Feb 24 17:22:29 2017 File:/home/stephen/code/IoTGW/azure-iot-gateway-sdk_0222/modules/sqlite/src/sqlite.c Func:sqlite_exec Line:315 SQL error: near ",": syntax error
Error: Time:Fri Feb 24 17:22:29 2017 File:/home/stephen/code/IoTGW/azure-iot-gateway-sdk_0222/modules/sqlite/src/sqlite.c Func:sqlite_exec Line:317 Error Query: @CREATE TRIGGER MODBUS_size_control INSERT ON MODBUS WHEN (select count(*) from MODBUS)>10
BEGIN
DELETE FROM MODBUS WHERE (ADDRESS,MAC,DATETIME) IN (SELECT ADDRESS,MAC,DATETIME FROM MODBUS ORDER BY DATETIME limit (select count(*) - 10 from MODBUS));
END;@
*请注意,添加@
符号只是为了确保我在SQL命令中没有包含一些愚蠢的不可见值。 @
不是sqlite3_exec执行的SQL命令的一部分。
除此之外,其他插入操作都可以正常工作。
另一个奇怪的事情是我运行了完全相同的SQL命令,导致sqlite3 shell程序中的错误。它工作得很好。
在sqlite3 shell中创建触发器后。我再次运行我的程序,它给了我一个完全不同的错误。
Error: Time:Fri Feb 24 17:52:49 2017 File:/home/stephen/code/IoTGW/azure-iot-gateway-sdk_0222/modules/sqlite/src/sqlite.c Func:sqlite_exec Line:315 SQL error: malformed database schema (MODBUS_size_control) - near ",": syntax error
Error: Time:Fri Feb 24 17:52:49 2017 File:/home/stephen/code/IoTGW/azure-iot-gateway-sdk_0222/modules/sqlite/src/sqlite.c Func:sqlite_exec Line:317 Error Query: @CREATE TRIGGER MODBUS_size_control INSERT ON MODBUS WHEN (select count(*) from MODBUS)>10
BEGIN
DELETE FROM MODBUS WHERE (ADDRESS,MAC,DATETIME) IN (SELECT ADDRESS,MAC,DATETIME FROM MODBUS ORDER BY DATETIME limit (select count(*) - 10 from MODBUS));
END;@
Error: Time:Fri Feb 24 17:52:51 2017 File:/home/stephen/code/IoTGW/azure-iot-gateway-sdk_0222/modules/sqlite/src/sqlite.c Func:sqlite_exec Line:315 SQL error: malformed database schema (MODBUS_size_control) - near ",": syntax error
Error: Time:Fri Feb 24 17:52:51 2017 File:/home/stephen/code/IoTGW/azure-iot-gateway-sdk_0222/modules/sqlite/src/sqlite.c Func:sqlite_exec Line:317 Error Query: @INSERT INTO MODBUS(VALUE,ADDRESS,MAC,DATETIME) VALUES(09221,40002,'01:01:01:01:01:01','2017-02-24 17:52:51');INSERT INTO MODBUS(VALUE,ADDRESS,MAC,DATETIME) VALUES(29113,40001,'01:01:01:01:01:01','2017-02-24 17:52:51');@
如图所示,即使以前工作的插入命令也不再有效。似乎触发器导致了所有问题。但我不明白为什么。它适用于Windows,适用于sqlite3 shell中的Ubuntu。即使我在创建触发器后从sqlite3 shell插入记录,它也能正常工作。 请指教。提前谢谢。
答案 0 :(得分:1)
问题记录在SQLite Documentation:
中触发器中的UPDATE,DELETE和INSERT语句不支持UPDATE,DELETE和INSERT语句的完整语法。以下限制适用:
您在触发器的DELETE语句中使用LIMIT-Clause:
DELETE FROM MODBUS
WHERE (ADDRESS,MAC,DATETIME) IN (SELECT ADDRESS,MAC,DATETIME FROM MODBUS
ORDER BY DATETIME
limit (select count(*) - 10 from MODBUS));
但错误信息有点误导。