0

试图在 Xcode / Swift5 / GRDB 中创建触发器。下面代码块中的触发器静默失败,所以我移动它并看到标题中的错误[我已从标题中删除了 SQL 语句的文本]。奇怪的是,DB Browser 将运行 SQL 并创建触发器就好了。并且应用程序使用外部创建的触发器按预期响应。并且内部的 UPDATE 似乎在触发器之外工作正常。

打开了GRDB github repo 的问题...只是通过原始 SQL。在线检查几个验证器。所有人要么说没有错,要么CREATE TABLE在下面的块中失败了……所以对任何验证者都不信任。

记得我在 ipad 上有 DraftCode,包括 phpLiteAdmin。发送 SQL 并得到相同的incomplete input错误。回到桌面...更新 PHP,并得到phpLiteAdmin...同样的错误。

所以...它是像https://github.com/sqlitebrowser/sqlitebrowser/issues/1470这样的 SQLite 错误?或者更可能是我的语法错误。我以前从来没有玩过触发器……所以我可能是个忽视显而易见的笨蛋。如果是这样,请帮我纠正。

还有一点有趣...在phpLiteAdmin,使用触发器生成器,一切正常。但尝试运行生成的创建 SQL 语句、复制/删除触发器/并重新粘贴,会产生相同的错误

SQLite version: 3.31.1
PHP version: 7.3.14
phpLiteAdmin version: 1.9.8.2

任何有关以 SQL 语句GRDBphpLiteAdminSQL 语句创建触发器的帮助将不胜感激。谢谢。

 CREATE TABLE CartItem (
 id INTEGER PRIMARY KEY AUTOINCREMENT,
 transactionID INTEGER DEFAULT NULL,
 wasReceived BOOLEAN,
 sku VARCHAR,
 label VARCHAR,
 description VARCHAR,
 unitLabel VARCHAR,
 cost DOUBLE,
 wholesale DOUBLE,
 retail DOUBLE,
 tax DOUBLE,
 cartQty FLOAT,
 modified REAL
 );

 -- because 'transaction' is reserved
 CREATE TABLE TransXion (
 id INTEGER PRIMARY KEY AUTOINCREMENT,
 transactionNum VARCHAR,
 shippingSubtotal DOUBLE,
 taxableSubtotal DOUBLE,
 nontaxableSubtotal DOUBLE,
 subtotal DOUBLE,
 total DOUBLE,
 paymentsSubtotal DOUBLE,
 balance DOUBLE,
 itemsWereRcvd BOOLEAN,
 locked BOOLEAN,
 modified REAL
 );


 CREATE TRIGGER insert_TransXion_Dollar_Values_trigger
     AFTER INSERT ON CartItem
     WHEN transactionID = new.transactionID
 BEGIN
     UPDATE TransXion
         SET total = (
             SELECT SUM(ci.retail) AS retail_total
             FROM CartItem ci
             WHERE ci.transactionID = TransXion.id
             )
         WHERE id IN (
             SELECT transactionID
             FROM CartItem ci
             WHERE ci.transactionID = TransXion.id
             );
 END;               

4

1 回答 1

1

在 phpLiteAdmin 的 SQL 选项卡中,语句由分隔符分隔,您可以在输入选项卡下方配置该分隔符。默认情况下,这是;. 在您使用的触发器定义;中,但拆分此时输入的内容会导致这两个查询:

第一个查询:

CREATE TRIGGER insert_TransXion_Dollar_Values_trigger
 AFTER INSERT ON CartItem
 WHEN transactionID = new.transactionID
 BEGIN
 UPDATE TransXion
     SET total = (
         SELECT SUM(ci.retail) AS retail_total
         FROM CartItem ci
         WHERE ci.transactionID = TransXion.id
         )
     WHERE id IN (
         SELECT transactionID
         FROM CartItem ci
         WHERE ci.transactionID = TransXion.id
         );

第二个查询:

END;  

所以这显然失败了。您可以简单地配置另一个分隔符$,以确保它作为一个查询执行。

于 2020-02-09T20:01:20.803 回答