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

  • Автор темы Автор темы svaminar
  • Дата начала Дата начала
Могу предложить как вариант использовать другую логику.
Добавить в таблицу поле Zennoid Ну или что то похожее.
И вместо селекта после блокировки делать Update поля Zennoid рандомним числовим значением.
Дальше уже по етому уникальному ид и работать с нужной строчкой.
1 кубик упдате поля
2 кубик уже работаем с базой
Да на костылях то и сейчас я могу найти варианты обойти эту проблему. Только нужно на текущем уровне преодолеть, так как в другой раз всё будет гораздо сложнее.
 
не?
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
не?
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: Задача именно спрятать переменные из результатов, на этом уровне необходимо найти решение
 
Я просто не знаю что там в MySQL, но ваш изначальный запрос в SQL Server присылает результат второго запроса
 
Я просто не знаю что там в MySQL, но ваш изначальный запрос в SQL Server присылает результат второго запроса
А ZP присылает результат первого запроса, в этом проблема, пока что не могу понять как этого избежать. Функционала выбора "вкладки" (как в HeidiSQL) я не наблюдаю.
 
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
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 запросов станет красивее и короче :-)
 
Последнее редактирование модератором:
Благодарю за подсказку. Удалось найти то что я ищу, выглядит вот так:
SQL:
Развернуть Свернуть Копировать
SELECT `data` FROM test WHERE id = 1 INTO @variable;
SELECT @variable;
Первая строка - тихо закидывает результат работы селекта в переменную. Вторая строка - выводит его, в моём случае я вывод делать не собираюсь и просто вставляю переменную в нужных мне местах.

Всех от души благодарю за участие и помощь! :-) Теперь код SQL запросов станет красивее и короче :-)
Как то это грузно :-) это тот запрос демонстранция принципа работы вот этой штуки @ и лока не более того... правильно и проще вот так:
SELECT* FROM test limit 1;
Выберет все поля сразу, одним запросом
 
Перечитал что нужно, можно вот так выборку делать если надо
SELECT`data` as myvar FROM test WHERE id =1;
Переменная на выходе будет под именем myvar
 
Это просто демонстрационный пример такой. А человеку нужно один раз получить какое-то значение, а потом его овердофига использовать в других запросах)) оптимизация (причем серьезная). Ну и плюс все это в транзакции под единым локом таблицы
 
  • Оценить
Реакции: CSS
Решение пришло откуда не ждали))
@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"

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

Заранее всем спасибо за помощь!
 
Последнее редактирование модератором:
V4siliy В коде?
у вас в функцию ExecuteQuery в качестве параметра param передается null?

C#:
Развернуть Свернуть Копировать
ZennoPoster.Db.ExecuteQuery(cmd, null, ZennoLab.InterfacesLibrary.Enums.Db.DbProvider.MySqlClient, conn);
 
да,

string answer = ZennoPoster.Db.ExecuteQuery(cmd, null, ZennoLab.InterfacesLibrary.Enums.Db.DbProvider.MySqlClient,conn, ";");
 
Не получается воспроизвести вашу ошибку, пробовал различные варианты. Приведите полный код проблемного C#-код блока.
 
Спасибо большое! Глаз замылился бороться с ошибкой, а готовя код вам для показа, я нашел string,indexof, который, не найдя нужной информации в строке от базы и выдавал ошибку.

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

А во время лока экшен не будет уходить в ошибку для других потоков или они будут ждать? Непонятно, как это реализовано, с полной поддержкой многопотока как те же таблицы/списки или может нужно постоянно чекать или ещё чем то заморачиваться.. В документации то почти ничего не сказано, вот и приходиться гадать :)
 
А во время лока экшен не будет уходить в ошибку для других потоков или они будут ждать?
Все это происходит на стороне SQL сервера, как там реализовано так и работает. Чаще всего запрос встает в ожидание, как только блок снимается он выполняется, все это время экшен будет ждать ответа.
 
  • Оценить
Реакции: dedok3000
как делать лок сразу для двух таблиц, использующихся в одном запросе?

если так 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
 
по стандарту первый вариант: LOCK TABLES table1 WRITE, table2 WRITE;
 
Люди, как подключиться к MySQL?
http://s020.radikal.ru/i708/1610/ae/1f4ba63dfe21.png
Этого ведь явно не достаточно.

Только не отправляйте меня сюда http://zennolab.com/wiki/ru:working-with-databases
Я там был и там можно почерпнуть что делать когда подключишься. А вот КАК подключиться???? Посоветуйте какую ветку форума скурить
 
А в чём конкретно проблема?
Что пишет в конструкторе при нажатии "Test Connection"?
Всё как всегда)) когда начинаешь разбираться с чем то абсолютно новым и не понятным. Не знаешь куда ткнуть чтоб заработало.
Не знал где найти адрес для внешних подключений, не знал что он называется именно так "адрес для внешних подключений" и куда его совать предполагал теоретически)). Чисто на инстинктах понимал что должен быть какой то адрес и этот адрес нужно засунуть.
Щас вроде разобрался.
 
Решение пришло откуда не ждали))
@svaminar делайте все так как делали сначала (т.е. "Использовать параметры в запросе" не ставьте)
и Ваш запрос заработает если в строку подключения добавите allowuservariables=True
Спасибо! Мне помогло :) Весь день промучился... теперь можно объявлять переменные и задавать им значения в запросе, конструкцией @var:=
так же как и в консоли mysql! :)
 
Привет, ребята! Что-то тугодумие напало среди ночи. Помогите с запросом пожалуйста. ТАкая же ошибка как в шапке вылезает. В 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

Отбой, другим путем пошел. Всем спасибо за внимание.
 
Последнее редактирование:
Ибо не создавать новую тему спрошу тут: Что может быть, кто может знает?

На ПК все шабы работали норм. Записывали тексты (и знаки препинания) в том числе и очень большие. Но когда перенёс mysql на сервер, то сразу прекратилось всё. Остальные данные в другие таблицы записывает а вот именно одна таблица перестала работать. В логе PM ничего не пишет. Просто кубик не выполняется и всё (красный крестик ;) ). Буду очень благодарен если кто-нибудь знает как решить проблему, может кто сталкивался...
 
Добрый день!
Столкнулся с проблемой. Если в таблице БД MySQL содержится поле типа json, запрос не отрабатывает. Получаю ошибку
"Выполнение действия Db Fatal error encountered during command execution."
Запрос элементарный select * from product limit 1
Если в таблице БД MySQL нет поля json, все хорошо.
Проект приложил. В первом экшене нужно вставить параметры БД.
... Help как бы )
 

Вложения

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