выражение CREATE EVENT создаёт новое событие выполняющееся по расписанию. События работают только при включенном планировщике расписаний (Event Scheduler)
Добрый Вечер, видео оказался очень классным. По теме евентов в интернете не достаточно информации, по крайне мере в рунете. У меня есть задачи более сложные что надо реализовать через евенты. Хотелось бы увидеть более сложные примеры, где после обработки цикла, записывать в базу результат работы. Когда началось, когда закончилось, сколько строк было затронуто и так далее. Было бы очень классно если бы вы сделали видео что то типа CREATE EVENT Advanced. Я на вас уже подписался.
Спасибо за развёрнутый комментарий. К сожалению ближайшее время ничего не обещаю - нужно отснять давно запланированный материал и стало больше нагрузки на рабочем месте. Если будет время, посмотрим с ближайшей группой по MySQL, а там отсниму. Если нет, ролика не будет
@@HtmllabRu Имейте ввиду что данная тема интересна людям и при этом вы можете сделать уникальный контент таким образом. И один лайк у вас точно будет от меня :)
@@HtmllabRu Если вы всё таки решитесь сделать видео, возможно стоит написать мне, я расскажу некоторые проблемы которые было бы хорошо затронуть и решить в видео, даже дам некоторые свои решения.
Добрый день! Прошу Вас дать дополнительный комментарий по строке: set @back = concat('select * into outfile \'C:/base/shar/b',@ti,'.txt\' from city limit 10'); Что за изоляция посредством символов "\" и правила ее написания?
Юрий, приветствую! Внутри строки записанной одинарными кавычками нельзя просто так использовать одинарные кавычки. Потому мы их экранировали обратным слешом (это работает и в других языках). Если бы внешние кавычки были двойными, можно было обойтись без \ внутри
Сколько можно создать EVENT событий в MySQL? В документации не нашел этой информации. Я планирую создавать очень много однотипных событий вроде этого: CREATE EVENT $event_name ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL $bs_time MINUTE DO UPDATE users SET `status` = 'wait', `time` = '$add_time' WHERE `id` = '$id' Сроки у событий от 1 до 15 дней и их может быть сотни или даже тысячи. После срабатывания, EVENT удаляется. Хочу понять, как это влияет на производительность, возможно есть ограничения? Спасибо!
Явных ограничений нет. Попробовал создать 10 тысяч, проблем при создании не возникло. А по производительности не скажу. Есть подозрения что может стать бутылочным горлышком, попробуйте потестировать.
Кстати хотел бы у вас поинтересоваться, а хорошим ли тоном будет создать событие которое вызывалось бы каждую секунду ? Предположим что я хочу наблюдать за определенной таблицей каждую секунду, подходят ли события для решения этого ?
У меня единожды создались файлы при исполнении события с выгрузкой в файл, и не обновляются на следующую минуту. Так оно и работает? Заново запустил конструкцию и снова то же самое - новые файлы создались и не обновляются.
Если событие однократное, то так и должно быть. При многократном нужно посмотреть что не так (например, файл уже существует или встретилось что-то непредвиденное)
У вас данные в текстовый аутфайл выгрузились красивенько, в столбик, а у меня в строчку, не очень красиво. Как это форматируется? Тоже хочу в столбик...
Если при выгрузке в запросе не указывали разделители, может дело в редакторе? Потому по умолчанию всегда в столбик. Если не получится, пришлите запрос и скрин выгрузки
@@HtmllabRu Да, в редакторе... Один только Блокнот открыл данные строкой, другие имеющиеся открывают в столбик. Но решение, которое не зависело бы от редактора, я не нашла. (Оно существует вообще?) Не совсем понятно, как построить этот запрос с разделителями. Не разобралась в синтаксисе SELECT * INTO OUTFILE, где там можно указать, разделители. Или это надо при создании таблицы позаботиться?
Пример запроса с разделителями (копипаст из доков dev.mysql.com/doc/refman/8.0/en/select-into.html) SELECT a,b,a+b INTO OUTFILE '/tmp/result.txt' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY ' ' FROM test_table; Тут FIELDS - разделители полей, LINES - строк.
@@HtmllabRu Спасибо, сама не докопалась :( И УРА! Блокнот побежден, пишет в столбик теперь! (Неприлично рада :))) ) Вот он, волшебный код: CREATE EVENT myevent ON SCHEDULE EVERY 10 SECOND DO BEGIN SET @seconds=SECOND(NOW()); SET @query=CONCAT('SELECT * INTO OUTFILE \'d:/Education/MYSQL/OutputFolder/goods',@seconds,'.txt\' FIELDS TERMINATED BY \',\' LINES TERMINATED BY \'\ \ \' FROM goods'); PREPARE stmt FROM @query; EXECUTE stmt; END|
Здравствуйте. Очень интересное и полезное видео! Большое спасибо! Есть пример как написать event для массовой замены текста в разных таблицах без учета регистра? Пример: UPDATE oc_product_description SET name = replace(REPLACE(name, 'Кухонный диван Кухонный диван', 'Кухонный диван'), 'Наматрасник Наматрасник','Наматрасник'); UPDATE oc_url_alias SET keyword = replace(REPLACE(keyword, 'shtory-Komplekt-shtor', 'shtory-komplekt'), 'Namatrasnik-namatrasnik','namatrasnik')WHERE query LIKE '%product_id%'; Данная команда меняет - Кухонный диван Кухонный диван Но не меняет если - Кухонный диван кухонный диван Как это можно правильно реализовать? По сути - нужно найти и заменить дубли в названиях и url товаров.
Похоже, вот это pento.net/2009/02/15/case-insensitive-replace-for-mysql/ может вам помочь. Проверил и разместил тот же пример с правильными кавычками и знаком больше - pastebin.com/8ZeidG5H
@@HtmllabRu что то никак в итоге не удалось верно все прописать. Не совсем понятно что в данном коде на что меняется. Поиск и замена там где прописано?
@@fazlihon при вызове replace_ci( 'mySQL', 'M', 'M' ) в строке 'mySQL' строка из второго аргумента меняется на строку из второго аргумента. Для UPDATE это будет выглядеть типа UPDATE вашатаблица SET вашеполе = replace_ci( вашеполе, 'йцу', 'кен' ). Такой запрос заменит в поле 'вашеполе' все фрагменты 'йцу' на 'кен'
@@HtmllabRu для чего в таком случае весь остальной код, если replace_ci( 'mySQL', 'M', 'M' ) - выведен за DELIMITER ; ? И если много замен UPDATE нужно каждую команду начинать с UPDATE или можно все же упростить?
Эм... всё проходит без ошибок, но файлы не создаются в папке. Там пустота. Пересмотрел еще раз видео, в итоге так и не понял где ошибка... может с адресом папки что-то не так, не пойму. Пробовал и в с:/mysql(чтобы сократить адрес) и в folder кидать :) -------------------------------------------------------------------------- DROP EVENT IF EXISTS myevent; --------------------------------------------------------------------------- delimiter | -------------------------------------------------------------------------- CREATE EVENT myevent ON SCHEDULE EVERY 10 SECOND DO BEGIN SET @seconds = SECOND(NOW()); SET @query = CONCAT('SELECT * INTO OUTFILE \'C:/mysql/goods',@seconds,'.txt\' FROM goods'); PREPARE stmt FROM @query; EXECUTE stmt; END| --------------------------------------------------------------------------- delimiter ; ---------------------------------------------------------------------------
Что можно предпринять: посмотреть логи, попробовать выполнить внутренний код события отдельно (я в дороге, пока не могу проверять), проверить включён ли планировщик (по умолчанию включён)
@@HtmllabRu всё, благодаря следующему уроку(18) пришлось немного погуглить и разобраться. В 18 уроке при сохранении файла в папку мне выдало что-то вроде ошибки "secure_file_priv". Нагуглил что необходимо ввести команду: SHOW VARIABLES LIKE "secure_file_priv"; Там появилась папка(адрес) в которую мне необходимо сохранять файлы при запросах. Попробовал на след уроке - получилось. Поставил этот же адрес в этом видео - тоже получилось и файлики начали появляться и добавляться. Усвоил что просто так в любое место не получится сохранять. :) Пока не разбирался как менять адрес сохранения. Но и на этом уже доволен. :) Хоть знаю куда теперь сохранять. Спс за уроки! Едем дальше!
В общем все хорошо, но немного автор халтурит. "Такое ощущение что они удалились на предыдущем шаге" - второе то да, а первое (без номера) не повторяется, поэтому, как я понял, оно удаляется автоматически после выполнения. Это моя личная интерпретация, я только учусь. казалось бы мелочь, но может свести с ума того, кто не понял этого, потом, при работе.
\d| create event myevent on schedule every 5 second do begin set @a2 = second(now()); prepare stmt from concat('select * into outfile \'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/digital',@a2 ,'.txt\' from goods'); execute stmt; end| Не могу понять в чем ошибка
@@HtmllabRu ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'concat('select * into outfile \'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/di' at line 1
В prepare нужно работать со строковой переменной (адрес папки подставьте свой, я тестил на ОпенСервере): create database testdb; use testdb create table Test(id integer, title varchar(100)); insert into Test(id, title) values(1, "Hello"); \d| create event myevent on schedule every 5 second do begin set @a2 = second(now()); set @a3 = concat('select * into outfile \'C:/OsPanel/OSPanel/userdata/temp/digital',@a2 ,'.txt\' from Test'); prepare stmt from @a3; execute stmt; end| \d;
Хорошая подача информации, я с базовыми знаниями sql и то всё понял, круто, спасибо
Как всегда канал меня снова выручил. Спасибо!
спустя 17 видео Вы наконец-то открыли мне тайну необычной(ConEmu) командной строки :D
большое спасибо за уроки!
Супер)
Алексей, спасибо за обзор.
Спасибо. Это высший пилотаж)
Это лишь основы, база. В реальных БД запросы на порядки сложнее
Спасибо!
Добрый Вечер, видео оказался очень классным. По теме евентов в интернете не достаточно информации, по крайне мере в рунете.
У меня есть задачи более сложные что надо реализовать через евенты. Хотелось бы увидеть более сложные примеры, где после обработки цикла, записывать в базу результат работы. Когда началось, когда закончилось, сколько строк было затронуто и так далее. Было бы очень классно если бы вы сделали видео что то типа CREATE EVENT Advanced. Я на вас уже подписался.
Спасибо за развёрнутый комментарий. К сожалению ближайшее время ничего не обещаю - нужно отснять давно запланированный материал и стало больше нагрузки на рабочем месте.
Если будет время, посмотрим с ближайшей группой по MySQL, а там отсниму. Если нет, ролика не будет
@@HtmllabRu Имейте ввиду что данная тема интересна людям и при этом вы можете сделать уникальный контент таким образом. И один лайк у вас точно будет от меня :)
@@HtmllabRu Если вы всё таки решитесь сделать видео, возможно стоит написать мне, я расскажу некоторые проблемы которые было бы хорошо затронуть и решить в видео, даже дам некоторые свои решения.
ааа...горшочек не вари! насоздавал кучу good.txt, пока нашел как отключить событие )
Добрый день!
Прошу Вас дать дополнительный комментарий по строке:
set @back = concat('select * into outfile \'C:/base/shar/b',@ti,'.txt\' from city limit 10');
Что за изоляция посредством символов "\" и правила ее написания?
Юрий, приветствую! Внутри строки записанной одинарными кавычками нельзя просто так использовать одинарные кавычки. Потому мы их экранировали обратным слешом (это работает и в других языках).
Если бы внешние кавычки были двойными, можно было обойтись без \ внутри
Сколько можно создать EVENT событий в MySQL?
В документации не нашел этой информации.
Я планирую создавать очень много однотипных событий вроде этого:
CREATE EVENT $event_name
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL $bs_time MINUTE
DO
UPDATE users
SET `status` = 'wait', `time` = '$add_time'
WHERE `id` = '$id'
Сроки у событий от 1 до 15 дней и их может быть сотни или даже тысячи.
После срабатывания, EVENT удаляется.
Хочу понять, как это влияет на производительность, возможно есть ограничения?
Спасибо!
Явных ограничений нет. Попробовал создать 10 тысяч, проблем при создании не возникло.
А по производительности не скажу. Есть подозрения что может стать бутылочным горлышком, попробуйте потестировать.
@@HtmllabRu Большое спасибо!
Кстати хотел бы у вас поинтересоваться, а хорошим ли тоном будет создать событие которое вызывалось бы каждую секунду ?
Предположим что я хочу наблюдать за определенной таблицей каждую секунду, подходят ли события для решения этого ?
Предположу, что это может быть дорогой операцией. Но конкретного совета нет(
@@HtmllabRu хорошо, спасибо за мысли)
У меня единожды создались файлы при исполнении события с выгрузкой в файл, и не обновляются на следующую минуту. Так оно и работает? Заново запустил конструкцию и снова то же самое - новые файлы создались и не обновляются.
Если событие однократное, то так и должно быть. При многократном нужно посмотреть что не так (например, файл уже существует или встретилось что-то непредвиденное)
У вас данные в текстовый аутфайл выгрузились красивенько, в столбик, а у меня в строчку, не очень красиво. Как это форматируется? Тоже хочу в столбик...
Если при выгрузке в запросе не указывали разделители, может дело в редакторе? Потому по умолчанию всегда в столбик. Если не получится, пришлите запрос и скрин выгрузки
@@HtmllabRu Да, в редакторе... Один только Блокнот открыл данные строкой, другие имеющиеся открывают в столбик. Но решение, которое не зависело бы от редактора, я не нашла. (Оно существует вообще?) Не совсем понятно, как построить этот запрос с разделителями. Не разобралась в синтаксисе SELECT * INTO OUTFILE, где там можно указать, разделители. Или это надо при создании таблицы позаботиться?
Пример запроса с разделителями (копипаст из доков dev.mysql.com/doc/refman/8.0/en/select-into.html)
SELECT a,b,a+b INTO OUTFILE '/tmp/result.txt'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '
'
FROM test_table;
Тут FIELDS - разделители полей, LINES - строк.
@@HtmllabRu Спасибо, сама не докопалась :( И УРА! Блокнот побежден, пишет в столбик теперь! (Неприлично рада :))) ) Вот он, волшебный код:
CREATE EVENT myevent
ON SCHEDULE EVERY 10 SECOND
DO
BEGIN
SET @seconds=SECOND(NOW());
SET @query=CONCAT('SELECT * INTO OUTFILE \'d:/Education/MYSQL/OutputFolder/goods',@seconds,'.txt\' FIELDS TERMINATED BY \',\' LINES TERMINATED BY \'\
\
\' FROM goods');
PREPARE stmt FROM @query;
EXECUTE stmt;
END|
@@oksanaulianchenko5065 отличная работа!
Как выполнить событие в определенную дату? к примеру 29.05.2020
CREATE EVENT your_ev
ON SCHEDULE AT '2020-05-29 00:00:00'
DO INSERT INTO your_db.your_tb VALUES (NULL, NOW());
Здравствуйте. Очень интересное и полезное видео! Большое спасибо! Есть пример как написать event для массовой замены текста в разных таблицах без учета регистра? Пример:
UPDATE oc_product_description SET name = replace(REPLACE(name, 'Кухонный диван Кухонный диван', 'Кухонный диван'), 'Наматрасник Наматрасник','Наматрасник');
UPDATE oc_url_alias SET keyword = replace(REPLACE(keyword, 'shtory-Komplekt-shtor', 'shtory-komplekt'), 'Namatrasnik-namatrasnik','namatrasnik')WHERE query LIKE '%product_id%';
Данная команда меняет - Кухонный диван Кухонный диван
Но не меняет если - Кухонный диван кухонный диван
Как это можно правильно реализовать?
По сути - нужно найти и заменить дубли в названиях и url товаров.
Похоже, вот это pento.net/2009/02/15/case-insensitive-replace-for-mysql/ может вам помочь. Проверил и разместил тот же пример с правильными кавычками и знаком больше - pastebin.com/8ZeidG5H
@@HtmllabRu Большое спасибо!
@@HtmllabRu что то никак в итоге не удалось верно все прописать. Не совсем понятно что в данном коде на что меняется. Поиск и замена там где прописано?
@@fazlihon при вызове replace_ci( 'mySQL', 'M', 'M' ) в строке 'mySQL' строка из второго аргумента меняется на строку из второго аргумента. Для UPDATE это будет выглядеть типа UPDATE вашатаблица SET вашеполе = replace_ci( вашеполе, 'йцу', 'кен' ). Такой запрос заменит в поле 'вашеполе' все фрагменты 'йцу' на 'кен'
@@HtmllabRu для чего в таком случае весь остальной код, если replace_ci( 'mySQL', 'M', 'M' ) - выведен за DELIMITER ; ? И если много замен UPDATE нужно каждую команду начинать с UPDATE или можно все же упростить?
Эм... всё проходит без ошибок, но файлы не создаются в папке. Там пустота. Пересмотрел еще раз видео, в итоге так и не понял где ошибка... может с адресом папки что-то не так, не пойму. Пробовал и в с:/mysql(чтобы сократить адрес) и в folder кидать :)
--------------------------------------------------------------------------
DROP EVENT IF EXISTS myevent;
---------------------------------------------------------------------------
delimiter |
--------------------------------------------------------------------------
CREATE EVENT myevent
ON SCHEDULE EVERY 10 SECOND
DO
BEGIN
SET @seconds = SECOND(NOW());
SET @query = CONCAT('SELECT * INTO OUTFILE
\'C:/mysql/goods',@seconds,'.txt\' FROM goods');
PREPARE stmt FROM @query;
EXECUTE stmt;
END|
---------------------------------------------------------------------------
delimiter ;
---------------------------------------------------------------------------
Что можно предпринять: посмотреть логи, попробовать выполнить внутренний код события отдельно (я в дороге, пока не могу проверять), проверить включён ли планировщик (по умолчанию включён)
@@HtmllabRu всё, благодаря следующему уроку(18) пришлось немного погуглить и разобраться.
В 18 уроке при сохранении файла в папку мне выдало что-то вроде ошибки "secure_file_priv".
Нагуглил что необходимо ввести команду: SHOW VARIABLES LIKE "secure_file_priv";
Там появилась папка(адрес) в которую мне необходимо сохранять файлы при запросах.
Попробовал на след уроке - получилось.
Поставил этот же адрес в этом видео - тоже получилось и файлики начали появляться и добавляться.
Усвоил что просто так в любое место не получится сохранять. :)
Пока не разбирался как менять адрес сохранения. Но и на этом уже доволен. :) Хоть знаю куда теперь сохранять.
Спс за уроки! Едем дальше!
В общем все хорошо, но немного автор халтурит. "Такое ощущение что они удалились на предыдущем шаге" - второе то да, а первое (без номера) не повторяется, поэтому, как я понял, оно удаляется автоматически после выполнения. Это моя личная интерпретация, я только учусь. казалось бы мелочь, но может свести с ума того, кто не понял этого, потом, при работе.
\d|
create event myevent on schedule every 5 second do begin set @a2 = second(now()); prepare stmt from concat('select * into outfile \'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/digital',@a2 ,'.txt\' from goods'); execute stmt; end|
Не могу понять в чем ошибка
Алексей, а что в ошибке?
@@HtmllabRu ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'concat('select * into outfile \'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/di' at line 1
В prepare нужно работать со строковой переменной (адрес папки подставьте свой, я тестил на ОпенСервере):
create database testdb;
use testdb
create table Test(id integer, title varchar(100));
insert into Test(id, title) values(1, "Hello");
\d|
create event myevent on schedule every 5 second do begin
set @a2 = second(now());
set @a3 = concat('select * into outfile \'C:/OsPanel/OSPanel/userdata/temp/digital',@a2 ,'.txt\' from Test');
prepare stmt from @a3;
execute stmt;
end|
\d;