☣️ MySQL вопросов тема

Nord

Client
Регистрация
22.03.2012
Сообщения
2 373
Благодарностей
1 433
Баллы
113
Решил заняться изучением MySQL по усерднее. До триггеров, еще как до неба...
И сразу наткнулся на некоторые подводные камни, которые отбивают весь интерес в изучении.
Вроде почитал умную книгу, все не так уж сложно (по крайней мере в таких элементарных операциях)

Работает отлично, возвращает IDшник следующего поста.
Код:
SELECT MAX(id)+1 FROM new_posts);
И эта строка. Вставляет запись в таблицу.
Код:
INSERT INTO old_posts (post_id, m_key, m_value) VALUES ('55', 'Name', 'Text') ;
А вот так - уже ничего не пашет. Нужно узнать ID и подставить его в другой таблице.

Код:
SET @m =(SELECT MAX(id) FROM new_posts);
INSERT INTO old_posts (post_id, m_key, m_value) VALUES ('@m', 'Name', 'Text') ;
Дак даже просто присвоить переменной значение никак не выходит, хоть по всем талмудам должно работать "на Ура".



Ткните, пожалуйста, носом, куда смотреть, пока азарт не пропал :dc:
 

DmitryAk

Client
Регистрация
14.12.2016
Сообщения
860
Благодарностей
818
Баллы
93
Ну зачем же ты себя так мучаешь? И это еще не началась работа с этими таблицами, где начнутся чудеса с дублями ID, невозможностями вставки, жесточайшими траблами с многопотоком и прочими радостями багожизни.
Тестовая таблица номер раз
Код:
CREATE TABLE `test1` (
   `ID` INT(11) NOT NULL AUTO_INCREMENT,
   `test_text` VARCHAR(50) NULL DEFAULT '0',
   INDEX `ID` (`ID`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=2
;
Тестовая таблица номер два
Код:
CREATE TABLE `test2` (
   `ID` INT(11) NOT NULL AUTO_INCREMENT,
   `OLD_ID` INT(11) NULL DEFAULT NULL,
   INDEX `ID` (`ID`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=2
;
Элементарнейший и простейший тригер тупо вставляющий айдишник из таблицы номер раз в таблицу номер два, когда происходит любая ВСТАВКА (insert) в таблицу раз.
Код:
CREATE DEFINER=`root`@`%` TRIGGER `test1_after_insert` AFTER INSERT ON `test1` FOR EACH ROW BEGIN
insert into test2(OLD_ID) values (new.ID);
END
Причем если кодом это выглядит страшно, то создание тригера в интерфейсе того же хейди - это два шага:
upload_2017-8-17_4-30-2.png

Выбираем на каком событии срабатывать:
upload_2017-8-17_4-30-51.png

И пишем что делать собственно - вставить в таблицу блаблабла в поле блафиелд значение из поля ID вставленной записи.
Если нужны другие поля из свежевставленной записи, то через NEW.имя_поля берем нужные значения.
upload_2017-8-17_4-41-18.png

И не надо извращений с всякими максайди и прочей ересью.
 
Последнее редактирование:

Nord

Client
Регистрация
22.03.2012
Сообщения
2 373
Благодарностей
1 433
Баллы
113
Так, прошел за пару дней уже ~40% основного курса MySQL. И что то мне сейчас начинают закрадываются такие подозрения, что в моей затее триггеры не проканают— для их создания нужен суперюзер, а такоге вряд ли же хостинг позволит получить?..:(
Anyway, закончу курс
 

DmitryAk

Client
Регистрация
14.12.2016
Сообщения
860
Благодарностей
818
Баллы
93
для их создания нужен суперюзер, а такоге вряд ли же хостинг позволит получить?
Ток если версия мускула до 5.1.6. Если более новая - суперюзер не нужен. И тупой вопрос, а почему именно на хостинге мускул? Почему не поднять под задачу мускуль рядом с зенкой или на отдельной самой дешманской впс-ке, раз уж так встает вопрос?
 

Nord

Client
Регистрация
22.03.2012
Сообщения
2 373
Благодарностей
1 433
Баллы
113
Ток если версия мускула до 5.1.6. Если более новая - суперюзер не нужен. И тупой вопрос, а почему именно на хостинге мускул? Почему не поднять под задачу мускуль рядом с зенкой или на отдельной самой дешманской впс-ке, раз уж так встает вопрос?
Ответ тебя удивит/заставит смотреть на меня, как на идиота =)
Сделал шаблон постинга в вордпресс через БД, все круто, посты улетают за секунду. Картинки параллельно по фтп заливаются.
Но одно но...:(
В таких постах еще тот геморрой с миниатюрой записи.
Для нее нужно конвертануть картинку, залить по фтп и проделать несколько лишних запросов. Как раз в одном из них и нужно указать ID последнего созданного поста, миниатюрой которого она будет.
Знаю, есть куча методов постинга в вордпресс, от вебморды и XML, до простых запросов, но вот захотелось все в БД и точка =)
Сижу, голову ломаю. Такое вот у меня, оно, возможно, и нафиг не надо, а из головы не уходит :an:
Заодно разбираюсь в MYSQL и C#, что , я считаю, очень даже нужно :ah::-)
 

DmitryAk

Client
Регистрация
14.12.2016
Сообщения
860
Благодарностей
818
Баллы
93
Ответ тебя удивит/заставит смотреть на меня, как на идиота =)
Вряд ли.. о тебе сложилось мнение, как о очень здравомыслящем человеке)
Заодно разбираюсь в MYSQL и C#, что , я считаю, очень даже нужно
Соглашусь, лишним не будет.
Знаю, есть куча методов постинга в вордпресс, от вебморды и XML, до простых запросов, но вот захотелось все в БД и точка =)
Метод имеет право на жизнь. Но для этой задачи, имхо, только через select last_insert_id() и лочить все инсерты общим локом, иначе на многопотоке подохнет смертью храбрых.
 
  • Спасибо
Реакции: Nord

Alelsey1611

Client
Регистрация
18.08.2017
Сообщения
401
Благодарностей
27
Баллы
28
Я тоже решил изучить mysql зашёл на сайт регнулся и реально не понимаю что дальше делать. Он чё бесплатнный что-ли? Прописать надо api или логин пароль? Сколько у меня осталось места в базе(если такой вопрос конечно уместен) ? Где личный кабинет? На сайте все на английском может по этому я не понял
 

Nord

Client
Регистрация
22.03.2012
Сообщения
2 373
Благодарностей
1 433
Баллы
113
Но для этой задачи, имхо, только через select last_insert_id() и лочить все инсерты общим локом, иначе на многопотоке подохнет смертью храбрых.
А в зенке нельзя в запросах использовать SET @blabla ?
При любой попытки ввести переменную выдает
Код:
Fatal error encountered during command execution.
При этом в phpMyAdminвсе конструкции отрабатывают отлично

UP

Нашел ответ.
Спасибо большое реализовал уже по другому.
А вот в етом @figa :=
как раз большая плюшка может получится при реализации сложних запросов

вот тут я про них прочитал
http://www.mysql.ru/docs/man/Variables.html

На мой нубский взгляд проблема в том что имя лок переменных начинается с знака @
С такого же знака @
Начинаются использование параметри запроса.



Хотя я могу и ошибатся.

Решение пришло откуда не ждали))
@svaminar делайте все так как делали сначала (т.е. "Использовать параметры в запросе" не ставьте)
и Ваш запрос заработает если в строку подключения добавите allowuservariables=True
 
Последнее редактирование:

DmitryAk

Client
Регистрация
14.12.2016
Сообщения
860
Благодарностей
818
Баллы
93
А в зенке нельзя в запросах использовать SET @blabla ?
Хз, если честно. Я по привычке, сложную логику в хранимые процедуры выношу, так что не было необходимости усложненные запросы на зенке ваять...
 

progrlab

Client
Регистрация
07.02.2014
Сообщения
204
Благодарностей
82
Баллы
28
Хз, если честно. Я по привычке, сложную логику в хранимые процедуры выношу, так что не было необходимости усложненные запросы на зенке ваять...
А как вызываете хранимую процедуру из Зеннки ?
 

DmitryAk

Client
Регистрация
14.12.2016
Сообщения
860
Благодарностей
818
Баллы
93
  • Спасибо
Реакции: progrlab

progrlab

Client
Регистрация
07.02.2014
Сообщения
204
Благодарностей
82
Баллы
28

DmitryAk

Client
Регистрация
14.12.2016
Сообщения
860
Благодарностей
818
Баллы
93
А синтаксис передачи параметров ?
Как обычно в мускуле.. через собачку определяем параметры и загоняем через Parameters.
Либо выгрузка в промежуточную табличку с передачей хранимке айдишника row для обработки.. много вариантов есть, как упростить себе жизнь)
 
  • Спасибо
Реакции: progrlab

Serg24

Client
Регистрация
16.12.2017
Сообщения
51
Благодарностей
4
Баллы
8
Привет.
Не могу найти инфо по C# + SQL (на хостинге).
Есть возможность один раз соединиться с БД и потом уже отправлять запросы?
Или нужно каждый раз в запросе указывать подключение
ZennoPoster.Db.ExecuteQuery("SELECT * FROM `wps` WHERE `id` = 1", null, ZennoLab.InterfacesLibrary.Enums.Db.DbProvider.MySqlClient, "...";
 

ZSharp

Client
Регистрация
29.09.2013
Сообщения
387
Благодарностей
121
Баллы
43
Чтобы не плодить темы спрашиваю здесь.

Скажите как получить ответ от сервера mysql?
Я говорю о переменной обработки результатов в экшне по работе с базой данных (в моём случае db_response)

Допустим я добавляю строку в бд если она добавилась, то экшн выполнился успешно но ответа о успехе в переменной нет.
Как его получить в переменную?

Или если при добавлении строки пытаюсь добавить дубль, то экшн отрабатывает с ошибкой, но в переменной опять ничего нет.

Как узнать что мне ответил сервер? Почему он не принял запрос, это ошибка дубля или это ошибка т.к. сервер не доступен или ещё чего.

mysql111.jpg

upd нашёл решение https://zennolab.com/discussion/posts/274902
Но оно возвращает только ошибку, а как все ответы проверять?
 
Последнее редактирование:

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