Вверх ↑
Этот топик читают: Гость
Ответов: 52
Рейтинг: 0
#1: 2020-08-07 20:19:11 ЛС | профиль | цитата
В таком запросе вылетает ошибка: near "WHERE": syntax error
Скажите, я что то не правильно делаю или при INSERT INTO нельзя вообще условия ставить в SQLite3?


INSERT INTO inventory (id1,id2,quantity,type,char_name)
VALUES (
(SELECT ('inventory'.'id'+1) AS 'free_id' FROM inventory
WHERE (SELECT 1 FROM inventory AS st
WHERE st.id = ('inventory'.'id'+1))
IS NULL ORDER BY 'inventory'.'id'+1
LIMIT 1),
%2,
1,
%5,
'%1'
)
WHERE (SELECT stackable FROM item
WHERE id = %2) = true AND
(SELECT money FROM character
WHERE name = '%1') ›=
(SELECT costBay FROM item
WHERE id = %2)AND
(SELECT EXISTS(
SELECT itemId
FROM inventory
WHERE itemId = %2 AND char_name = '%1'
LIMIT 1)) = 0;
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#2: 2020-08-07 20:38:32 ЛС | профиль | цитата
INSERT INTO table SELECT ...;

Вторая форма оператора INSERT содержит оператор SELECT вместо предложения VALUES. Новая запись вставляется в таблицу для каждой строки данных, возвращаемых при выполнении оператора SELECT. Если указан список столбцов, количество столбцов в результате SELECT должно быть таким же, как количество элементов в списке столбцов. В противном случае, если список столбцов не указан, количество столбцов в результате SELECT должно совпадать с количеством столбцов в таблице. Любой оператор SELECT, включая составные операторы SELECT и SELECT с предложениями ORDER BY и / или LIMIT , может использоваться в операторе INSERT этой формы.

Чтобы избежать двусмысленности синтаксического анализа, оператор SELECT всегда должен содержать предложение WHERE, даже если это предложение просто "WHERE true"

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 52
Рейтинг: 0
#3: 2020-08-07 22:50:06 ЛС | профиль | цитата
Tad писал(а):
INSERT INTO table SELECT ...;
Чтобы избежать двусмысленности синтаксического анализа, оператор SELECT всегда должен содержать предложение WHERE, даже если это предложение просто "WHERE true"

Спасибо, Tad!!!
Я порыскал в и-нет, до этого момента почему-то не знал как правильно вбить в гугл, плюс перечитывая твой ответ, и получилось.
INSERT INTO inventory (id,id2,quantity,type,char_name)SELECT
(SELECT ('inventory'.'id'+1) AS 'free_id' FROM inventory
WHERE (SELECT 1 FROM inventory AS st
WHERE st.id = ('inventory'.'id'+1))
IS NULL ORDER BY 'inventory'.'id'+1
LIMIT 1),
%2,
1,
'%5',
'%1'
WHERE (SELECT stackable FROM item
WHERE id = %2) = 'true' AND
(SELECT money FROM character
WHERE name = '%1') >=
(SELECT costBay FROM item
WHERE id = %2)AND
(SELECT EXISTS(
SELECT itemId
FROM inventory
WHERE itemId = %2 AND char_name = '%1'
LIMIT 1)) = 0;

Редактировалось 2 раз(а), последний 2020-08-07 22:50:58
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#4: 2020-08-08 07:58:36 ЛС | профиль | цитата
Всё равно слишком заумно.
Если inventory.id INTEGER PRIMARY KEY, то хватило бы и
INSERT INTO inventory (id,id2,quantity,type,char_name) VALUES(NULL, %2, 1, '%5', '%1');

Редактировалось 1 раз(а), последний 2020-08-08 11:01:31
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 52
Рейтинг: 0
#5: 2020-08-08 14:18:01 ЛС | профиль | цитата
Tad писал(а):
Всё равно слишком заумно.
Если inventory.id INTEGER PRIMARY KEY, то хватило бы и
INSERT INTO inventory (id,id2,quantity,type,char_name) VALUES(NULL, %2, 1, '%5', '%1');


Пример ID:
1
2
5
6

Я раньше так делал, но в таком случае при добавлении новой записала автоматом ставить id 7.
А то как у меня указано тогда добавляет запись с id 3.

Редактировалось 1 раз(а), последний 2020-08-08 14:28:45
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#6: 2020-08-09 09:27:38 ЛС | профиль | цитата
atutunnik94 писал(а):
Я раньше так делал, но в таком случае при добавлении новой записала автоматом ставить id 7.
А то как у меня указано тогда добавляет запись с id 3.
ну и что это даёт?
Ничего кроме увеличения времени обработки запроса.
Ecли время не имеет значения, то можно и так:

SELECT min(id+1) FROM inventory WHERE id+1 NOT IN (SELECT id FROM inventory);
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 52
Рейтинг: 0
#7: 2020-08-09 13:38:52 ЛС | профиль | цитата
Tad писал(а):
Ничего кроме увеличения времени обработки запроса.
Не сильно увеличило время, пока что совсем не заметно, а так точно id в последовательности будут, хоть как то приятно в базу смотреть, так то, без этого я сам пока тестил, цыфры id уже за тысячу переходили, хотя было всего три записи, потому впилил это.

Tad писал(а):
Ecли время не имеет значения, то можно и так:

SELECT min(id+1) FROM inventory WHERE id+1 NOT IN (SELECT id FROM inventory);
Ваш вариант я попробую тоже, спасибо за подсказку.

Хочу еще спросить, вы случайно в подобном https://forum.hiasm.com/topic/67757 не сможете подсказать?
И еще вопрос, можно как нить отключить системный звук в приложении, при случайном нажатии клавиш клавиатуры?

Редактировалось 4 раз(а), последний 2020-08-09 13:41:40
карма: 0

0
7
Сообщение
...
Прикрепленные файлы
(файлы не залиты)