Mysql Не работает запрос в постере ?

CSS

Client
Регистрация
22.05.2010
Сообщения
1 327
Благодарностей
663
Баллы
113
Могу предложить как вариант использовать другую логику.
Добавить в таблицу поле Zennoid Ну или что то похожее.
И вместо селекта после блокировки делать Update поля Zennoid рандомним числовим значением.
Дальше уже по етому уникальному ид и работать с нужной строчкой.
1 кубик упдате поля
2 кубик уже работаем с базой
Да на костылях то и сейчас я могу найти варианты обойти эту проблему. Только нужно на текущем уровне преодолеть, так как в другой раз всё будет гораздо сложнее.
 

AShaggy

Активный пользователь
Регистрация
25.11.2014
Сообщения
335
Благодарностей
143
Баллы
43
не?
SQL:
START TRANSACTION;
LOCK TABLES test WRITE;
SELECT test.`data` FROM test WHERE id=(SELECT id FROM test WHERE id=1 LIMIT 1) LIMIT 1;
UNLOCK TABLES;
COMMIT;
 
  • Спасибо
Реакции: CSS

CSS

Client
Регистрация
22.05.2010
Сообщения
1 327
Благодарностей
663
Баллы
113
не?
SQL:
START TRANSACTION;
LOCK TABLES test WRITE;
SELECT test.`data` FROM test WHERE id=(SELECT id FROM test WHERE id=1 LIMIT 1) LIMIT 1;
UNLOCK TABLES;
COMMIT;
Оно конечно работает, только является грязным кодом :-) То есть мне придётся эту конструкцию дублировать всякий раз когда понадобится использование ID, получается теряется весь смысл использования переменных.

PS: Задача именно спрятать переменные из результатов, на этом уровне необходимо найти решение
 

AShaggy

Активный пользователь
Регистрация
25.11.2014
Сообщения
335
Благодарностей
143
Баллы
43
Я просто не знаю что там в MySQL, но ваш изначальный запрос в SQL Server присылает результат второго запроса
 

CSS

Client
Регистрация
22.05.2010
Сообщения
1 327
Благодарностей
663
Баллы
113
Я просто не знаю что там в MySQL, но ваш изначальный запрос в SQL Server присылает результат второго запроса
А ZP присылает результат первого запроса, в этом проблема, пока что не могу понять как этого избежать. Функционала выбора "вкладки" (как в HeidiSQL) я не наблюдаю.
 

AShaggy

Активный пользователь
Регистрация
25.11.2014
Сообщения
335
Благодарностей
143
Баллы
43
SQL server через ZP тоже результат второго запроса
может стоит включить свои переменные и делать типа
SQL:
START TRANSACTION;
LOCK TABLES test WRITE;
SET @task = SELECT id FROM test WHERE id=1 LIMIT 1;
SELECT test.`data` FROM test WHERE id=@task LIMIT 1;
UNLOCK TABLES;
COMMIT;
я в синтаксисе могу ошибаться
 
  • Спасибо
Реакции: CSS

CSS

Client
Регистрация
22.05.2010
Сообщения
1 327
Благодарностей
663
Баллы
113
SQL server через ZP тоже результат второго запроса
может стоит включить свои переменные и делать типа
SQL:
START TRANSACTION;
LOCK TABLES test WRITE;
SET @task = SELECT id FROM test WHERE id=1 LIMIT 1;
SELECT test.`data` FROM test WHERE id=@task LIMIT 1;
UNLOCK TABLES;
COMMIT;
я в синтаксисе могу ошибаться
Благодарю за подсказку. Удалось найти то что я ищу, выглядит вот так:
SQL:
SELECT `data` FROM test WHERE id = 1 INTO @variable;
SELECT @variable;
Первая строка - тихо закидывает результат работы селекта в переменную. Вторая строка - выводит его, в моём случае я вывод делать не собираюсь и просто вставляю переменную в нужных мне местах.

Всех от души благодарю за участие и помощь! :-) Теперь код SQL запросов станет красивее и короче :-)
 
Последнее редактирование модератором:

Gfoblin

Client
Регистрация
30.05.2013
Сообщения
4 596
Благодарностей
1 014
Баллы
113
Благодарю за подсказку. Удалось найти то что я ищу, выглядит вот так:
SQL:
SELECT `data` FROM test WHERE id = 1 INTO @variable;
SELECT @variable;
Первая строка - тихо закидывает результат работы селекта в переменную. Вторая строка - выводит его, в моём случае я вывод делать не собираюсь и просто вставляю переменную в нужных мне местах.

Всех от души благодарю за участие и помощь! :-) Теперь код SQL запросов станет красивее и короче :-)
Как то это грузно :-) это тот запрос демонстранция принципа работы вот этой штуки @ и лока не более того... правильно и проще вот так:
SELECT* FROM test limit 1;
Выберет все поля сразу, одним запросом
 

Gfoblin

Client
Регистрация
30.05.2013
Сообщения
4 596
Благодарностей
1 014
Баллы
113
Перечитал что нужно, можно вот так выборку делать если надо
SELECT`data` as myvar FROM test WHERE id =1;
Переменная на выходе будет под именем myvar
 

AShaggy

Активный пользователь
Регистрация
25.11.2014
Сообщения
335
Благодарностей
143
Баллы
43
Это просто демонстрационный пример такой. А человеку нужно один раз получить какое-то значение, а потом его овердофига использовать в других запросах)) оптимизация (причем серьезная). Ну и плюс все это в транзакции под единым локом таблицы
 
  • Спасибо
Реакции: CSS

V4siliy

Client
Регистрация
11.12.2015
Сообщения
5
Благодарностей
1
Баллы
3
Решение пришло откуда не ждали))
@svaminar делайте все так как делали сначала (т.е. "Использовать параметры в запросе" не ставьте)
и Ваш запрос заработает если в строку подключения добавите allowuservariables=True
Помогите! Подскажите, как в коде реализовать данное решение проблемы ?

Мой случай:
C#:
string conn = "server=127.0.0.1;user id=user;password=user;database=user";
string cmd = @"START TRANSACTION;
            SELECT @A:=id FROM table
            WHERE param1 = '1' AND param2 = '2' LIMIT 1;
            UPDATE table SET param1 '2' WHERE id = @A;
            SELECT * FROM table WHERE id = @A;
            COMMIT;";
Без allowuservariables=True в conn выдает известную Fatal error encountered during command execution.
Если добавить в строку conn это значение (string conn = "server=127.0.0.1;user id=user;password=user;database=user;allowuservariables=True";-), то получаем другую ошибку:

"Длина не может быть меньше нуля.
Имя параметра: length"

Запрос при этом не выполняется.

Заранее всем спасибо за помощь!
 
Последнее редактирование модератором:

AShaggy

Активный пользователь
Регистрация
25.11.2014
Сообщения
335
Благодарностей
143
Баллы
43
V4siliy В коде?
у вас в функцию ExecuteQuery в качестве параметра param передается null?

C#:
ZennoPoster.Db.ExecuteQuery(cmd, null, ZennoLab.InterfacesLibrary.Enums.Db.DbProvider.MySqlClient, conn);
 

V4siliy

Client
Регистрация
11.12.2015
Сообщения
5
Благодарностей
1
Баллы
3
да,

string answer = ZennoPoster.Db.ExecuteQuery(cmd, null, ZennoLab.InterfacesLibrary.Enums.Db.DbProvider.MySqlClient,conn, ";");
 

AShaggy

Активный пользователь
Регистрация
25.11.2014
Сообщения
335
Благодарностей
143
Баллы
43
Не получается воспроизвести вашу ошибку, пробовал различные варианты. Приведите полный код проблемного C#-код блока.
 

V4siliy

Client
Регистрация
11.12.2015
Сообщения
5
Благодарностей
1
Баллы
3
Спасибо большое! Глаз замылился бороться с ошибкой, а готовя код вам для показа, я нашел string,indexof, который, не найдя нужной информации в строке от базы и выдавал ошибку.

allowuservariables=True отработало идеально! Моя проблема решена.
 

dedok3000

Client
Регистрация
08.01.2012
Сообщения
91
Благодарностей
9
Баллы
8
и всё таки, по поводу экшена БД, для всех запросов нужно делать лок? или для селекта можно и не делать?
 

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 715
Баллы
113

AShaggy

Активный пользователь
Регистрация
25.11.2014
Сообщения
335
Благодарностей
143
Баллы
43
и всё таки, по поводу экшена БД, для всех запросов нужно делать лок? или для селекта можно и не делать?
Смотря какие задачи, нужно думать что происходит. Большинство запросов на выборку можно делать и без блокировок. Но бывают и критические секции (CS) в которых, если не делать блокировки, можно серьезно попасть. Вот представим, что вы продаете билеты, и один пользователь выбрал места и проводит оплату. А другой пользователь смотрит список свободных мест и тоже выбирает те же места (ибо они еще не отмечены как проданные). Вот и выходит CS. А СУБД то пофиг на это, она кто последний оплатит того и помечает владельцем билетов.
Это я конечно утрирую, но суть, надеюсь, понятна.
Почему не стоит пихать везде блокировки? да это тупо уменьшает производительность.
 
  • Спасибо
Реакции: dedok3000

dedok3000

Client
Регистрация
08.01.2012
Сообщения
91
Благодарностей
9
Баллы
8
я вообще не делаю :D
вроде ни одной проблемы не видел
А во время лока экшен не будет уходить в ошибку для других потоков или они будут ждать? Непонятно, как это реализовано, с полной поддержкой многопотока как те же таблицы/списки или может нужно постоянно чекать или ещё чем то заморачиваться.. В документации то почти ничего не сказано, вот и приходиться гадать :-)
 

AShaggy

Активный пользователь
Регистрация
25.11.2014
Сообщения
335
Благодарностей
143
Баллы
43
А во время лока экшен не будет уходить в ошибку для других потоков или они будут ждать?
Все это происходит на стороне SQL сервера, как там реализовано так и работает. Чаще всего запрос встает в ожидание, как только блок снимается он выполняется, все это время экшен будет ждать ответа.
 
  • Спасибо
Реакции: dedok3000

dedok3000

Client
Регистрация
08.01.2012
Сообщения
91
Благодарностей
9
Баллы
8
как делать лок сразу для двух таблиц, использующихся в одном запросе?

если так LOCK TABLES table1 WRITE, table2 WRITE;
то # MySQL returned an empty result set

если LOCK TABLES table1, table2 WRITE;
то #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version
 

AShaggy

Активный пользователь
Регистрация
25.11.2014
Сообщения
335
Благодарностей
143
Баллы
43
по стандарту первый вариант: LOCK TABLES table1 WRITE, table2 WRITE;
 

jonvy

Client
Регистрация
28.11.2015
Сообщения
305
Благодарностей
17
Баллы
18
Люди, как подключиться к MySQL?
http://s020.radikal.ru/i708/1610/ae/1f4ba63dfe21.png
Этого ведь явно не достаточно.

Только не отправляйте меня сюда http://zennolab.com/wiki/ru:working-with-databases
Я там был и там можно почерпнуть что делать когда подключишься. А вот КАК подключиться???? Посоветуйте какую ветку форума скурить
 

LaGir

Client
Регистрация
01.10.2015
Сообщения
227
Благодарностей
927
Баллы
93

jonvy

Client
Регистрация
28.11.2015
Сообщения
305
Благодарностей
17
Баллы
18
А в чём конкретно проблема?
Что пишет в конструкторе при нажатии "Test Connection"?
Всё как всегда)) когда начинаешь разбираться с чем то абсолютно новым и не понятным. Не знаешь куда ткнуть чтоб заработало.
Не знал где найти адрес для внешних подключений, не знал что он называется именно так "адрес для внешних подключений" и куда его совать предполагал теоретически)). Чисто на инстинктах понимал что должен быть какой то адрес и этот адрес нужно засунуть.
Щас вроде разобрался.
 

Petr_G

Client
Регистрация
20.10.2017
Сообщения
96
Благодарностей
53
Баллы
18
Решение пришло откуда не ждали))
@svaminar делайте все так как делали сначала (т.е. "Использовать параметры в запросе" не ставьте)
и Ваш запрос заработает если в строку подключения добавите allowuservariables=True
Спасибо! Мне помогло :-) Весь день промучился... теперь можно объявлять переменные и задавать им значения в запросе, конструкцией @var:=
так же как и в консоли mysql! :-)
 

Gor

Client
Регистрация
30.09.2016
Сообщения
248
Благодарностей
30
Баллы
28
Привет, ребята! Что-то тугодумие напало среди ночи. Помогите с запросом пожалуйста. ТАкая же ошибка как в шапке вылезает. В Navicat работает, в зенке - нет. Запросы:
Код:
SET @pages:=24;
SET @rezult_url:="https://www.olx.ua/detskiy-mir/detskie-kolyaski/kiev/?search%5Bdistrict_id%5D=17";
LOCK TABLES olx_urls_test WRITE;
call a2();
UNLOCK TABLES;
Процедурa a2:
Код:
BEGIN
UPDATE olx_urls_test SET pages = @pages where rezult_url = @rezult_url;
END
Отбой, другим путем пошел. Всем спасибо за внимание.
 
Последнее редактирование:

Vasalex

Client
Регистрация
27.09.2016
Сообщения
263
Благодарностей
19
Баллы
18
Ибо не создавать новую тему спрошу тут: Что может быть, кто может знает?

На ПК все шабы работали норм. Записывали тексты (и знаки препинания) в том числе и очень большие. Но когда перенёс mysql на сервер, то сразу прекратилось всё. Остальные данные в другие таблицы записывает а вот именно одна таблица перестала работать. В логе PM ничего не пишет. Просто кубик не выполняется и всё (красный крестик ;-) ). Буду очень благодарен если кто-нибудь знает как решить проблему, может кто сталкивался...
 

inotoxic

Client
Регистрация
20.04.2015
Сообщения
354
Благодарностей
164
Баллы
43

Gor

Client
Регистрация
30.09.2016
Сообщения
248
Благодарностей
30
Баллы
28
Добрый день!
Столкнулся с проблемой. Если в таблице БД MySQL содержится поле типа json, запрос не отрабатывает. Получаю ошибку
"Выполнение действия Db Fatal error encountered during command execution."
Запрос элементарный select * from product limit 1
Если в таблице БД MySQL нет поля json, все хорошо.
Проект приложил. В первом экшене нужно вставить параметры БД.
... Help как бы )
 

Вложения

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)