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

Nord

Client
Регистрация
22.03.2012
Сообщения
2 432
Реакции
1 494
Баллы
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') ;

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

5493a720b4864174554add256ef4f6e0.png


Ткните, пожалуйста, носом, куда смотреть, пока азарт не пропал :dc:
 
Ну зачем же ты себя так мучаешь? И это еще не началась работа с этими таблицами, где начнутся чудеса с дублями 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

И не надо извращений с всякими максайди и прочей ересью.
 
Последнее редактирование:
Так, прошел за пару дней уже ~40% основного курса MySQL. И что то мне сейчас начинают закрадываются такие подозрения, что в моей затее триггеры не проканают— для их создания нужен суперюзер, а такоге вряд ли же хостинг позволит получить?..:(
Anyway, закончу курс
 
для их создания нужен суперюзер, а такоге вряд ли же хостинг позволит получить?
Ток если версия мускула до 5.1.6. Если более новая - суперюзер не нужен. И тупой вопрос, а почему именно на хостинге мускул? Почему не поднять под задачу мускуль рядом с зенкой или на отдельной самой дешманской впс-ке, раз уж так встает вопрос?
 
Ток если версия мускула до 5.1.6. Если более новая - суперюзер не нужен. И тупой вопрос, а почему именно на хостинге мускул? Почему не поднять под задачу мускуль рядом с зенкой или на отдельной самой дешманской впс-ке, раз уж так встает вопрос?
Ответ тебя удивит/заставит смотреть на меня, как на идиота =)
Сделал шаблон постинга в вордпресс через БД, все круто, посты улетают за секунду. Картинки параллельно по фтп заливаются.
Но одно но...:(
В таких постах еще тот геморрой с миниатюрой записи.
Для нее нужно конвертануть картинку, залить по фтп и проделать несколько лишних запросов. Как раз в одном из них и нужно указать ID последнего созданного поста, миниатюрой которого она будет.
Знаю, есть куча методов постинга в вордпресс, от вебморды и XML, до простых запросов, но вот захотелось все в БД и точка =)
Сижу, голову ломаю. Такое вот у меня, оно, возможно, и нафиг не надо, а из головы не уходит :an:
Заодно разбираюсь в MYSQL и C#, что , я считаю, очень даже нужно :ah::-)
 
Ответ тебя удивит/заставит смотреть на меня, как на идиота =)
Вряд ли.. о тебе сложилось мнение, как о очень здравомыслящем человеке)
Заодно разбираюсь в MYSQL и C#, что , я считаю, очень даже нужно
Соглашусь, лишним не будет.
Знаю, есть куча методов постинга в вордпресс, от вебморды и XML, до простых запросов, но вот захотелось все в БД и точка =)
Метод имеет право на жизнь. Но для этой задачи, имхо, только через select last_insert_id() и лочить все инсерты общим локом, иначе на многопотоке подохнет смертью храбрых.
 
  • Спасибо
Реакции: Nord
Я тоже решил изучить mysql зашёл на сайт регнулся и реально не понимаю что дальше делать. Он чё бесплатнный что-ли? Прописать надо api или логин пароль? Сколько у меня осталось места в базе(если такой вопрос конечно уместен) ? Где личный кабинет? На сайте все на английском может по этому я не понял
 
Но для этой задачи, имхо, только через select last_insert_id() и лочить все инсерты общим локом, иначе на многопотоке подохнет смертью храбрых.
А в зенке нельзя в запросах использовать SET @blabla ?
При любой попытки ввести переменную выдает
Код:
Развернуть Свернуть Копировать
Fatal error encountered during command execution.
При этом в phpMyAdminвсе конструкции отрабатывают отлично

UP

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

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

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

ru:db-pic3.png


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


Решение пришло откуда не ждали))
@svaminar делайте все так как делали сначала (т.е. "Использовать параметры в запросе" не ставьте)
и Ваш запрос заработает если в строку подключения добавите allowuservariables=True
 
Последнее редактирование:
А в зенке нельзя в запросах использовать SET @blabla ?
Хз, если честно. Я по привычке, сложную логику в хранимые процедуры выношу, так что не было необходимости усложненные запросы на зенке ваять...
 
Хз, если честно. Я по привычке, сложную логику в хранимые процедуры выношу, так что не было необходимости усложненные запросы на зенке ваять...
А как вызываете хранимую процедуру из Зеннки ?
 
  • Спасибо
Реакции: progrlab
А синтаксис передачи параметров ?
Как обычно в мускуле.. через собачку определяем параметры и загоняем через Parameters.
Либо выгрузка в промежуточную табличку с передачей хранимке айдишника row для обработки.. много вариантов есть, как упростить себе жизнь)
 
  • Спасибо
Реакции: progrlab
Привет.
Не могу найти инфо по C# + SQL (на хостинге).
Есть возможность один раз соединиться с БД и потом уже отправлять запросы?
Или нужно каждый раз в запросе указывать подключение
ZennoPoster.Db.ExecuteQuery("SELECT * FROM `wps` WHERE `id` = 1", null, ZennoLab.InterfacesLibrary.Enums.Db.DbProvider.MySqlClient, "...";
 
Чтобы не плодить темы спрашиваю здесь.

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

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

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

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

mysql111.jpg

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

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