SQLite CREATE TRIGGER ... SQLite ошибка 1 с оператором: неполный ввод - PullRequest
0 голосов
/ 03 февраля 2020

пытается создать триггер в Xcode / Swift5 / GRDB. триггер в кодовом блоке ниже не работает, поэтому я перемещаю его и вижу ошибку в заголовке [я удалил текст оператора SQL из заголовка]. странная часть в том, что DB Browser будет запускать SQL и СОЗДАТЬ триггер просто отлично. и приложение отвечает, как и ожидалось, с помощью внешнего триггера. и кажется, что UPDATE внутри прекрасно работает вне триггера.

открыл выпуск с репозиторием GRDB github ... просто передавая необработанный SQL thru. проверьте несколько валидаторов онлайн. все либо сказали, что в этом нет ничего плохого, либо потерпели неудачу на CREATE TABLE в блоке ниже ... так что не верьте ни одному из валидаторов

вспомнил, что у меня есть DraftCode на ipad, с включенным phpLiteAdmin. отправьте SQL и получите ту же ошибку incomplete input. вернитесь на рабочий стол ... обновите PHP и получите phpLiteAdmin ... та же ошибка.

так ... это либо ошибка SQLite, как https://github.com/sqlitebrowser/sqlitebrowser/issues/1470? или, скорее, синтаксическая ошибка с моей стороны. Я никогда не играл с триггерами раньше ... так что я могу быть тупицей, упускающим из виду очевидное. если да, пожалуйста, помогите мне исправить.

еще один интересный момент ... в phpLiteAdmin, используя триггер-компоновщик, все работает просто отлично. но попытка запустить результирующий оператор create SQL, скопировать / удалить триггер / и вставить обратно, выдает ту же ошибку

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

, любую помощь по созданию триггера в GRDB или phpLiteAdmin как SQL заявление будет оценено. спасибо.

 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;               

1 Ответ

0 голосов
/ 09 февраля 2020

На вкладке SQL в phpLiteAdmin операторы разделяются разделителем, который можно настроить под вкладкой ввода. По умолчанию это ;. В своем определении триггера вы используете ;, но разделение того, что вы вводите в этот момент, приводит к этим двум запросам:

Первый запрос:

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;  

Так что это, очевидно, не удается. Вы можете просто настроить другой разделитель, например $, чтобы он выполнялся как один запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...