17. MySQL 8 CREATE EVENT работа с событиями

Поделиться
HTML-код
  • Опубликовано: 10 июн 2019
  • выражение CREATE EVENT создаёт новое событие выполняющееся по расписанию. События работают только при включенном планировщике расписаний (Event Scheduler)

Комментарии • 47

  • @llwebstylell242
    @llwebstylell242 Год назад +2

    Хорошая подача информации, я с базовыми знаниями sql и то всё понял, круто, спасибо

  • @шмяка
    @шмяка Год назад +1

    Как всегда канал меня снова выручил. Спасибо!

  • @JaneDoe-ns8sb
    @JaneDoe-ns8sb 2 года назад +1

    спустя 17 видео Вы наконец-то открыли мне тайну необычной(ConEmu) командной строки :D
    большое спасибо за уроки!

  • @elchupanebrej
    @elchupanebrej 5 лет назад +1

    Алексей, спасибо за обзор.

  • @user-wd6bi2he7z
    @user-wd6bi2he7z 3 года назад +2

    Спасибо. Это высший пилотаж)

    • @user-ke9fk6gc2p
      @user-ke9fk6gc2p 21 день назад

      Это лишь основы, база. В реальных БД запросы на порядки сложнее

  • @shchekavytsia
    @shchekavytsia 3 года назад

    Спасибо!

  • @alexhabasescu601
    @alexhabasescu601 4 года назад +2

    Добрый Вечер, видео оказался очень классным. По теме евентов в интернете не достаточно информации, по крайне мере в рунете.
    У меня есть задачи более сложные что надо реализовать через евенты. Хотелось бы увидеть более сложные примеры, где после обработки цикла, записывать в базу результат работы. Когда началось, когда закончилось, сколько строк было затронуто и так далее. Было бы очень классно если бы вы сделали видео что то типа CREATE EVENT Advanced. Я на вас уже подписался.

    • @HtmllabRu
      @HtmllabRu  4 года назад +2

      Спасибо за развёрнутый комментарий. К сожалению ближайшее время ничего не обещаю - нужно отснять давно запланированный материал и стало больше нагрузки на рабочем месте.
      Если будет время, посмотрим с ближайшей группой по MySQL, а там отсниму. Если нет, ролика не будет

    • @alexhabasescu601
      @alexhabasescu601 4 года назад +1

      @@HtmllabRu Имейте ввиду что данная тема интересна людям и при этом вы можете сделать уникальный контент таким образом. И один лайк у вас точно будет от меня :)

    • @alexhabasescu601
      @alexhabasescu601 4 года назад +1

      @@HtmllabRu Если вы всё таки решитесь сделать видео, возможно стоит написать мне, я расскажу некоторые проблемы которые было бы хорошо затронуть и решить в видео, даже дам некоторые свои решения.

  • @user-os1xg1rh4c
    @user-os1xg1rh4c 4 года назад +3

    ааа...горшочек не вари! насоздавал кучу good.txt, пока нашел как отключить событие )

  • @dr-cary
    @dr-cary 4 года назад +2

    Добрый день!
    Прошу Вас дать дополнительный комментарий по строке:
    set @back = concat('select * into outfile \'C:/base/shar/b',@ti,'.txt\' from city limit 10');
    Что за изоляция посредством символов "\" и правила ее написания?

    • @HtmllabRu
      @HtmllabRu  4 года назад +3

      Юрий, приветствую! Внутри строки записанной одинарными кавычками нельзя просто так использовать одинарные кавычки. Потому мы их экранировали обратным слешом (это работает и в других языках).
      Если бы внешние кавычки были двойными, можно было обойтись без \ внутри

  • @homyakpoedatelll
    @homyakpoedatelll 4 года назад +3

    Сколько можно создать 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 удаляется.
    Хочу понять, как это влияет на производительность, возможно есть ограничения?
    Спасибо!

    • @HtmllabRu
      @HtmllabRu  4 года назад +2

      Явных ограничений нет. Попробовал создать 10 тысяч, проблем при создании не возникло.
      А по производительности не скажу. Есть подозрения что может стать бутылочным горлышком, попробуйте потестировать.

    • @homyakpoedatelll
      @homyakpoedatelll 4 года назад

      @@HtmllabRu Большое спасибо!

  • @llwebstylell242
    @llwebstylell242 Год назад

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

    • @HtmllabRu
      @HtmllabRu  Год назад +2

      Предположу, что это может быть дорогой операцией. Но конкретного совета нет(

    • @llwebstylell242
      @llwebstylell242 Год назад

      @@HtmllabRu хорошо, спасибо за мысли)

  • @vitaltennis
    @vitaltennis 10 месяцев назад

    У меня единожды создались файлы при исполнении события с выгрузкой в файл, и не обновляются на следующую минуту. Так оно и работает? Заново запустил конструкцию и снова то же самое - новые файлы создались и не обновляются.

    • @HtmllabRu
      @HtmllabRu  10 месяцев назад +1

      Если событие однократное, то так и должно быть. При многократном нужно посмотреть что не так (например, файл уже существует или встретилось что-то непредвиденное)

  • @oksanaulianchenko5065
    @oksanaulianchenko5065 4 года назад

    У вас данные в текстовый аутфайл выгрузились красивенько, в столбик, а у меня в строчку, не очень красиво. Как это форматируется? Тоже хочу в столбик...

    • @HtmllabRu
      @HtmllabRu  4 года назад

      Если при выгрузке в запросе не указывали разделители, может дело в редакторе? Потому по умолчанию всегда в столбик. Если не получится, пришлите запрос и скрин выгрузки

    • @oksanaulianchenko5065
      @oksanaulianchenko5065 4 года назад

      @@HtmllabRu Да, в редакторе... Один только Блокнот открыл данные строкой, другие имеющиеся открывают в столбик. Но решение, которое не зависело бы от редактора, я не нашла. (Оно существует вообще?) Не совсем понятно, как построить этот запрос с разделителями. Не разобралась в синтаксисе SELECT * INTO OUTFILE, где там можно указать, разделители. Или это надо при создании таблицы позаботиться?

    • @HtmllabRu
      @HtmllabRu  4 года назад

      Пример запроса с разделителями (копипаст из доков 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 - строк.

    • @oksanaulianchenko5065
      @oksanaulianchenko5065 4 года назад +2

      @@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|

    • @HtmllabRu
      @HtmllabRu  4 года назад

      @@oksanaulianchenko5065 отличная работа!

  • @to22helly55
    @to22helly55 4 года назад

    Как выполнить событие в определенную дату? к примеру 29.05.2020

    • @HtmllabRu
      @HtmllabRu  4 года назад +3

      CREATE EVENT your_ev
      ON SCHEDULE AT '2020-05-29 00:00:00'
      DO INSERT INTO your_db.your_tb VALUES (NULL, NOW());

  • @fazlihon
    @fazlihon 4 года назад +1

    Здравствуйте. Очень интересное и полезное видео! Большое спасибо! Есть пример как написать 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 товаров.

    • @HtmllabRu
      @HtmllabRu  4 года назад +1

      Похоже, вот это pento.net/2009/02/15/case-insensitive-replace-for-mysql/ может вам помочь. Проверил и разместил тот же пример с правильными кавычками и знаком больше - pastebin.com/8ZeidG5H

    • @fazlihon
      @fazlihon 4 года назад

      @@HtmllabRu Большое спасибо!

    • @fazlihon
      @fazlihon 4 года назад

      @@HtmllabRu что то никак в итоге не удалось верно все прописать. Не совсем понятно что в данном коде на что меняется. Поиск и замена там где прописано?

    • @HtmllabRu
      @HtmllabRu  4 года назад

      @@fazlihon при вызове replace_ci( 'mySQL', 'M', 'M' ) в строке 'mySQL' строка из второго аргумента меняется на строку из второго аргумента. Для UPDATE это будет выглядеть типа UPDATE вашатаблица SET вашеполе = replace_ci( вашеполе, 'йцу', 'кен' ). Такой запрос заменит в поле 'вашеполе' все фрагменты 'йцу' на 'кен'

    • @fazlihon
      @fazlihon 4 года назад

      @@HtmllabRu для чего в таком случае весь остальной код, если replace_ci( 'mySQL', 'M', 'M' ) - выведен за DELIMITER ; ? И если много замен UPDATE нужно каждую команду начинать с UPDATE или можно все же упростить?

  • @victordelacroix654
    @victordelacroix654 3 года назад

    Эм... всё проходит без ошибок, но файлы не создаются в папке. Там пустота. Пересмотрел еще раз видео, в итоге так и не понял где ошибка... может с адресом папки что-то не так, не пойму. Пробовал и в с:/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
      @HtmllabRu  3 года назад

      Что можно предпринять: посмотреть логи, попробовать выполнить внутренний код события отдельно (я в дороге, пока не могу проверять), проверить включён ли планировщик (по умолчанию включён)

    • @victordelacroix654
      @victordelacroix654 3 года назад +2

      @@HtmllabRu всё, благодаря следующему уроку(18) пришлось немного погуглить и разобраться.
      В 18 уроке при сохранении файла в папку мне выдало что-то вроде ошибки "secure_file_priv".
      Нагуглил что необходимо ввести команду: SHOW VARIABLES LIKE "secure_file_priv";
      Там появилась папка(адрес) в которую мне необходимо сохранять файлы при запросах.
      Попробовал на след уроке - получилось.
      Поставил этот же адрес в этом видео - тоже получилось и файлики начали появляться и добавляться.
      Усвоил что просто так в любое место не получится сохранять. :)
      Пока не разбирался как менять адрес сохранения. Но и на этом уже доволен. :) Хоть знаю куда теперь сохранять.
      Спс за уроки! Едем дальше!

  • @wilsonikner1167
    @wilsonikner1167 11 месяцев назад

    В общем все хорошо, но немного автор халтурит. "Такое ощущение что они удалились на предыдущем шаге" - второе то да, а первое (без номера) не повторяется, поэтому, как я понял, оно удаляется автоматически после выполнения. Это моя личная интерпретация, я только учусь. казалось бы мелочь, но может свести с ума того, кто не понял этого, потом, при работе.

  • @rukigaki
    @rukigaki 3 года назад +1

    \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
      @HtmllabRu  3 года назад

      Алексей, а что в ошибке?

    • @rukigaki
      @rukigaki 3 года назад

      @@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

    • @HtmllabRu
      @HtmllabRu  3 года назад +2

      В 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;