• MySQL매뉴얼
    • MySQL 5.6 매뉴얼
    • MySQL 5.1 매뉴얼
    • MySQL 5.0 매뉴얼
    • MySQL HA 매뉴얼
  • 기술문서
    • Xtrabackup 구성
    • 메모리 사용량 모니터링
  • 라이선스
  • 온라인문의
  • 회사소개
  • → 목 록 (MySQL5.6 한글메뉴얼) [close]
  • 1. MySQL 5.6 새로운 기능
  • 2. MySQL 설치 및 업그레이드
  • 3. MySQL Tutorial
  • 4. MySQL 프로그램
  • 5. MySQL 서버관리
  • 6. 보안
  • 7. 백업 및 복구
  • 8. 최적화
  • 9. Language Structure(언어구조)
  • 10. Character Sets(Globalization)
  • 11. 데이터형(Data Types)
  • 12. 함수와 연산자
  • 13. SQL 문법
  • 1. 데이터 정의 문
    1. ALTER DATABASE 구문
    2. ALTER EVENT 구문
    3. ALTER LOGFILE GROUP 구문
    4. ALTER FUNCTION 구문
    5. ALTER PROCEDURE 구문
    6. ALTER SERVER 구문
    7. ALTER TABLE 구문
    8. ALTER TABLESPACE 구문
    9. ALTER VIEW 구문
    10. REATE DATABASE 구문
    11. CREATE EVENT 구문
    12. CREATE FUNCTION 구문
    13. CREATE INDEX 구문
    14. CREATE LOGFILE GROUP 구문
    15. CREATE PROCEDURE 및 CREATE FUNCTION 구문
    16. CREATE SERVER 구문
    17. CREATE TABLE 구문
    18. CREATE TABLESPACE 구문
    19. CREATE TRIGGER 구문
    20. CREATE VIEW 구문
    21. DROP DATABASE 구문
    22. DROP EVENT 구문
    23. DROP FUNCTION 구문
    24. DROP INDEX 구문
    25. DROP LOGFILE GROUP 구문
    26. DROP PROCEDURE 및 DROP FUNCTION 구문
    27. DROP SERVER 구문
    28. DROP TABLE 구문
    29. DROP TABLESPACE 구문
    30. DROP TRIGGER 구문
    31. DROP VIEW 구문
    32. RENAME TABLE 구문
    33. TRUNCATE TABLE 구문
    2. 데이터 조작 문
    3. MySQL 트랜잭션과 잠금 문
    4. 복제 문
    5. Prepared Statements위한 SQL 구문
    6. MySQL 복합문 구문
    7. 데이터베이스 관리 문
    8. MySQL 유틸리티 문
  • 14. InnoDB 스토리지 엔진
  • 15. 기타 스토리지 엔진
  • 16. 고가용성 및 확장성
  • 17. 리플리케이션
  • 18. MySQL Cluster
  • 19. 파티셔닝
  • 20. Stored Programs and Views
  • 21. INFORMATION_SCHEMA
  • 22. PERFORMANCE SCHEMA
  • 23. 컨넥터 및 API
  • 24. MySQL 확장
  • 25. MySQL Enterprise Edition
  • 26. MySQL Workbench
  • 27. 제약 및 제한
  • 28. MySQL 5.7 새로운 기능

13.1.11 CREATE EVENT 구문

CREATE
    [DEFINER = { user | CURRENT_USER }]
    EVENT
    [IF NOT EXISTS]
    event_name
    ON SCHEDULE schedule
    [ON COMPLETION [NOT] PRESERVE]
    [ENABLE | DISABLE | DISABLE ON SLAVE]
    [COMMENT 'comment']
    DO event_body;

schedule:
    AT timestamp [+ INTERVAL interval] ...
  | EVERY interval
    [STARTS timestamp [+ INTERVAL interval] ...]
    [ENDS timestamp [+ INTERVAL interval] ...]

interval:
    quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
              WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
              DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND} 

이 문은 새로운 이벤트를 만들고 예약합니다. 이 이벤트는 이벤트 스케줄러가 활성화되어 있지 않은 한 실행되지 않습니다. 이벤트 스케줄러의 상태를 확인하고 필요에 따라 그것을 사용하는 방법은 섹션 20.4.2 "이벤트 스케줄러 구성" 을 참조하십시오.

CREATE EVENT 이벤트가 생성 된 스키마에 대한 EVENT 권한이 필요합니다. 이 섹션의 나머지 부분에서 설명 된 바와 같이, DEFINER 값에 따라 SUPER 권한이 필요할 수 있습니다.

유효한 CREATE EVENT 문의 최소 요구 사항은 다음과 같습니다.

  • 키워드 CREATE EVENT 이외에 데이터베이스 스키마의 이벤트를 고유하게 식별하는 이벤트 이름입니다.

  • 이벤트가 실행되는시기와 빈도를 결정하는 ON SCHEDULE 절.

  • 이벤트에 의해 실행되는 SQL 문을 포함 DO 절.

최소한의 CREATE EVENT 문의 예를 보여줍니다.

 CREATE EVENT myevent
     ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR
     DO
       UPDATE myschema.mytable SET mycol = mycol + 1;

이전 문은 myevent 라는 이벤트를 만듭니다. 이 이벤트는 myschema.mytable 테이블 mycol 컬럼의 값을 1 증가하는 SQL 문을 실행하여 (그 생성의 1 시간 후) 1 회 실행됩니다.

event_name 은 최대 길이가 64 자 유효한 MySQL 식별자 여야합니다. 이벤트 이름은 대소 문자를 구분하지 않기 때문에 myevent 과 MyEvent 라는 두 가지 이벤트를 동일한 스키마에 포함 할 수 없습니다. 일반적으로 이벤트 이름을 관리하는 규칙은 스토어드 루틴의 이름과 동일합니다. 섹션 9.2 "스키마 객체 이름" 을 참조하십시오.

이벤트는 스키마에 연결되어 있습니다. event_name 의 일부로 스키마가 표시되지 않은 경우 기본 (현재) 스키마로 간주됩니다. 이벤트를 특정 스키마에 작성하려면 schema_name . event_name 구문을 사용하여 이벤트 이름을 스키마로 수식합니다.

DEFINER 절은 이벤트 실행시 액세스 권한을 확인하는 데 사용되는 MySQL 계정을 지정합니다. user 값을 지정하려면 ' user_name '@' host_name ' ( GRANT 문에 사용되는 것과 같은 형식), CURRENT_USER 또는 CURRENT_USER() 로 지정된 MySQL 계정에하십시오. DEFINER 의 기본값은 CREATE EVENT 문을 실행하는 사용자입니다. 이것은 명시 적으로 DEFINER = CURRENT_USER 를 지정하는 것과 동일합니다.

DEFINER 절을 지정한 경우 다음의 규칙에 따라 유효한 DEFINER 사용자 값이 결정됩니다.

  • SUPER 권한이없는 경우 허용되는 유일한 user 값은 리터럴로 지정하거나 CURRENT_USER 를 사용하여 지정한 계정입니다. 정의들을 다른 계정으로 설정할 수 없습니다.

  • SUPER 권한이 있으면 구문으로 유효한 계정 이름을 지정할 수 있습니다. 계정이 실제로 존재하지 않는 경우 경고가 생성됩니다.

  • 존재하지 않는 DEFINER 계정에서 이벤트를 만들 수 있지만 해당 계정이 존재하지 않는 경우 이벤트 실행시 오류가 발생합니다.

이벤트의 보안 자세한 내용은 섹션 20.6 "저장 프로그램 및 뷰의 액세스 제어" 를 참조하십시오.

이벤트 내에서 CURRENT_USER() 함수가 이벤트 실행시 권한을 확인하는 데 사용되는 계정 ( DEFINER 사용자)를 돌려줍니다. 이벤트의 사용자 감사 내용은 섹션 6.3.13 "SQL 기반의 MySQL 계정 활동 감사" 를 참조하십시오.

CREATE EVENT 에서 IF NOT EXISTS 에는 CREATE TABLE 의 경우와 같은 의미가 있습니다. event_name 라는 이벤트가 같은 스키마에 이미 존재하는 경우, 액션은 실행되지 않고 오류도 발생하지 않습니다. (단, 이런 경우는 경고가 생성됩니다.)

ON SCHEDULE 절은 해당 이벤트에 대해 정의 된 event_body 를 반복시기, 빈도 및 기간을 결정합니다. 이 절은 다음의 두 가지 형식 중 하나를 취합니다.

  • 일회성 이벤트에는 AT timestamp 가 사용됩니다. 이것은 이벤트가 timestamp 에 지정된 날짜와 시간에 한 번만 실행되도록 지정합니다. 이 값은 날짜와 시간 모두를 포함한다 또는 datetime 값에 해결되는 식이어야합니다. 이 목적은 DATETIME 또는 TIMESTAMP 형의 값 중 하나를 사용할 수 있습니다. 날짜가 과거 날짜 인 경우는 다음과 같이 경고가 발생합니다.

    mysql> SELECT NOW();
    +---------------------+
    | NOW()               |
    +---------------------+
    | 2006-02-10 23:59:01 |
    +---------------------+
    1 row in set (0.04 sec)
    
    mysql> CREATE EVENT e_totals
        ->     ON SCHEDULE AT '2006-02-10 23:59:00'
        ->     DO INSERT INTO test.totals VALUES (NOW());
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    
    mysql> SHOW WARNINGS\G
    *************************** 1. row ***************************
      Level: Note
       Code: 1588
    Message: Event execution time is in the past and ON COMPLETION NOT
             PRESERVE is set. The event was dropped immediately after
             creation.
    

    어떤 이유로 든 그 자체가 잘못된 CREATE EVENT 문은 오류로 실패합니다.

    현재 날짜와 시간을 지정하려면 CURRENT_TIMESTAMP 를 사용할 수 있습니다. 이런 경우, 이벤트는 생성 되 자마자 작동합니다.

    현재 날짜와 시간을 기준으로 한 ​​미래의 어떤 시점 ( "지금부터 3 주 후에"라는 문구로 나타나는 시점 등)에 발생하는 이벤트를 만들려면 옵션 어구 + INTERVAL interval 을 사용할 수 있습니다 . interval 부분은 수량과 시간 단위의 두 부분으로 구성되어 DATE_ADD() 함수에서 사용되는 간격을 관리하는 것과 동일한 구문 규칙을 따릅니다 ( 섹션 12.7 "날짜 및 시간 함수" 를 참조하십시오) . 또한 단위의 키워드도 이벤트를 정의하려면 마이크로 초를 포함한 단위를 사용할 수없는 점을 제외하고 동일합니다. 일부 간격 형에서는 복합의 시간 단위를 사용할 수 있습니다. 예를 들어, "2 분 10 초"는 + INTERVAL '2:10' MINUTE_SECOND 로 나타낼 수 있습니다.

    또한 간격을 결합 할 수 있습니다. 예를 들어, AT CURRENT_TIMESTAMP + INTERVAL 3 WEEK + INTERVAL 2 DAY 는 "지금부터 3 주 2 일 후 '와 동일합니다. 이러한 어구의 각 부분은 + INTERVAL 로 시작해야합니다.

  • 작업을 주기적으로 반복은 EVERY 절을 사용합니다. EVERY 키워드 뒤에 이전 AT 키워드의 설명에 표시된 interval 을 지정합니다. ( EVERY 는 + INTERVAL 는 사용되지 않습니다.) 예를 들어, EVERY 6 WEEK 은 "6 주마다"를 나타냅니다.

    EVERY 절에서는 + INTERVAL 절은 허용되지 않지만 + INTERVAL 내에서 허용되는 것과 같은 복합의 시간 단위를 사용할 수 있습니다.

    EVERY 절에는 옵션 STARTS 절을 포함 할 수 있습니다. STARTS 다음에이 작업이 언제 반복을 시작 하는지를 나타내는 timestamp 값을 지정합니다. 또한 + INTERVAL interval 을 사용하여 "지금부터"시간을 지정할 수도 있습니다. 예를 들어, EVERY 3 MONTH STARTS CURRENT_TIMESTAMP + INTERVAL 1 WEEK 는 "지금부터 1 주일 후에 시작하고 3 개월마다"를 나타냅니다. 뿐만 아니라 "지금부터 6 시간 15 분 후부터 시작하여 2 주마다"를 EVERY 2 WEEK STARTS CURRENT_TIMESTAMP + INTERVAL '6:15' HOUR_MINUTE 로 나타낼 수 있습니다. STARTS 를 지정하지 않는 것은, STARTS CURRENT_TIMESTAMP 를 사용하는 것과 같습니다. 즉, 이벤트에 지정된 조치는 이벤트가 생성되면 즉시 반복을 시작합니다.

    EVERY 절에는 옵션 ENDS 절을 포함 할 수 있습니다. ENDS 키워드 다음에이 이벤트가 언제 반복을 중지 여부 MySQL에 지시 할 timestamp 값을 지정합니다. 또한 ENDS 함께 + INTERVAL interval 을 사용할 수 있습니다. 예를 들어, EVERY 12 HOUR STARTS CURRENT_TIMESTAMP + INTERVAL 30 MINUTE ENDS CURRENT_TIMESTAMP + INTERVAL 4 WEEK 는 "지금부터 30 분 후에 시작하고 지금부터 4 주 후에 종료 될 때까지 12 시간마다"와 동일합니다. ENDS 를 사용하지 않는 것은이 이벤트가 언제까지 실행을 계속하는 것을 나타냅니다.

    ENDS 는 복합 시간 단위에 STARTS 과 같은 구문을 지원합니다.

    EVERY 절에서는 STARTS 또는 ENDS 또는 둘 모두를 사용할 수 있습니다. 또한 둘 다 사용하지 않을 수도 있습니다.

    반복 이벤트가 일정 간격 내에 종료하지 않으면 이벤트의 여러 인스턴스가 동시에 실행될 수 있습니다. 이것이 바람직하지 않은 경우는 동시 인스턴스를 방지 할 수있는 메커니즘을 마련하십시오. 예를 들어, GET_LOCK() 함수와 행 또는 테이블 잠금을 사용할 수 있습니다.

ON SCHEDULE 절에서는 내장 MySQL 함수 및 사용자 변수를 포함하는 식을 사용하여 거기에 포함되어있는 모든 timestamp 또는 interval 값을 얻을 수 있습니다. 이런 식으로 저장 기능과 사용자 정의 함수를 사용하거나 테이블 참조를 사용 할 수 없습니다. 그러나 SELECT FROM DUAL 사용할 수 있습니다. 이것은 CREATE EVENT 문과 ALTER EVENT 문에 모두 적용됩니다. 이러한 경우 저장 기능, 사용자 정의 함수 및 테이블에 대한 참조는 명시 적으로 금지되어 있으며 오류와 함​​께 실패합니다 (Bug # 22830를 참조하십시오).

ON SCHEDULE 절 시간은 현재 세션 time_zone 값을 사용하여 해석됩니다. 이 이벤트의 시간대, 즉 이벤트를 예약에 사용 된 이벤트가 실행되면 그 이벤트에서 사용되는 시간대입니다. 이러한 시간은 UTC로 변환 된 이벤트의 시간대와 함께 mysql.event 테이블에 저장됩니다. 이렇게하면 서버 시간대 또는 일광의 영향에 대해 발생한 변경 사항과 무관하게 정의 된대로 이벤트의 실행을 처리 할 수​​ 있습니다. 이벤트의 시간 표현 대한 자세한 내용은 섹션 20.4.4 "이벤트 메타 데이터" 를 참조하십시오. 섹션 13.7.5.19 "SHOW EVENTS 구문" 과 섹션 21.7 "INFORMATION_SCHEMA EVENTS 테이블" 을 참조하십시오.

일반적으로 이벤트 기간이 만료되면 이벤트는 즉시 삭제됩니다. 이 동작은 ON COMPLETION PRESERVE 를 지정하여 재정의 할 수 있습니다. ON COMPLETION NOT PRESERVE 를 사용하면 단순히 기본 비 지속성 동작이 명시적인뿐입니다.

DISABLE 키워드를 사용하면 이벤트는 만들 수 있지만 그것이 활성화되지 않도록 할 수 있습니다. 또는 ENABLE 을 사용하여 기본 상태 (활성)을 명시 적으로 할 수 있습니다. 이것은 ALTER EVENT 과 결합하면 가장 효과적입니다 ( 섹션 13.1.2 "ALTER EVENT 구문" 을 참조하십시오).

ENABLE 과 DISABLE 대신 세 번째 값을 사용할 수 있습니다. DISABLE ON SLAVE 이벤트가 마스터에서 만들어진 슬레이브에 복제되었지만 아직 슬레이브에서 실행되지 않았 음을 나타 내기 위해 리플리케이션 슬레이브에서 이벤트의 상태에 대해 설정됩니다. 섹션 17.4.1.11 "호출되는 기능의 복제" 를 참조하십시오.

COMMENT 절을 사용하여 이벤트에 대한 코멘트를 지정할 수 있습니다. comment 는 이벤트 설명에 사용하는 최대 64 문자의 임의의 문자열을 지정할 수 있습니다. 코멘트 텍스트는 문자열 리터럴이기 때문에 따옴표로 묶어야합니다.

DO 절은 이벤트에 의해 실행되는 액션을 지정하는 것이며, SQL 문으로 구성됩니다. 스토어드 루틴에서 사용할 수있는 유효한 MySQL 문의 거의 모든 스케줄 된 이벤트의 액션 문으로도 사용할 수 있습니다. ( 섹션 D.1 "저장 프로그램 제한 사항" 을 참조하십시오.) 예를 들어, 다음 이벤트 e_hourly 는 sessions 테이블의 모든 행을 1 시간에 1 회 삭제합니다. 여기서,이 테이블은 site_activity 스키마의 일부입니다.

 CREATE EVENT e_hourly
     ON SCHEDULE
       EVERY 1 HOUR
     COMMENT 'Clears out sessions table each hour.'
     DO
       DELETE FROM site_activity.sessions;

MySQL은 이벤트가 생성되거나 변경 될 때 유효한 sql_mode 시스템 변수의 설정을 저장하고 이벤트가 실행을 시작했을 때 현재의 서버 SQL 모드에 관계없이 항상 그 이벤트를 강제로이 설정 에서 실행합니다.

DO 절에 ALTER EVENT 문을 포함하는 CREATE EVENT 문은 성공한 것처럼 보인다. 그러나 결과 예약 된 이벤트를 서버가 실행하려고하면 실행 오류로 실패합니다.

참고

단순히 결과 집합을 반환하는 SELECT 또는 SHOW 등의 문은 이벤트에서 사용되어 아무런 효과도 없습니다. 이러한 진술의 출력은 MySQL 모니터에 전송되지 않고, 또한 어디에도 저장되지 않습니다. 그러나 결과를 포함하는 SELECT ... INTO 와 INSERT INTO ... SELECT 등의 문은 사용할 수 있습니다. (후자의 예는이 섹션에있는 다음 예제를 참조하십시오.)

이벤트가 속하는 스키마는 DO 절에서 테이블 참조에 대한 디폴트 스키마입니다. 다른 스키마의 테이블에 대한 참조는 모두 올바른 스키마 이름으로 규정해야합니다.

다음과 같이 스토어드 루틴과 마찬가지로, BEGIN 및 END 키워드를 사용하여 DO 절에서 복합 명령문의 구문을 사용할 수 있습니다.

 delimiter |

 CREATE EVENT e_daily
     ON SCHEDULE
       EVERY 1 DAY
     COMMENT 'Saves total number of sessions then clears the table each day'
     DO
       BEGIN
         INSERT INTO site_activity.totals (time, total)
           SELECT CURRENT_TIMESTAMP, COUNT (*)
             FROM site_activity.sessions;
         DELETE FROM site_activity.sessions;
       END |

 delimiter;

이 예제에서는 delimiter 명령을 사용하여 문 구분자를 변경합니다. 섹션 20.1 "저장 프로그램의 정의" 를 참조하십시오.

이벤트에서는 스토어드 루틴에서 사용되는 같은 더 복잡한 복합 문을 사용할 수 있습니다. 이 예에서는 로컬 변수 오류 처리기 및 흐름 제어 구조 구문을 사용하고 있습니다.

 delimiter |

 CREATE EVENT e
     ON SCHEDULE
       EVERY 5 SECOND
     DO
       BEGIN
         DECLARE v INTEGER;
         DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END;

         SET v = 0;

         WHILE v <5 DO
           INSERT INTO t1 VALUES (0);
           UPDATE t2 SET s1 = s1 + 1;
           SET v = v + 1;
         END WHILE;
     END |

 delimiter;

이벤트 또는 이벤트에서 직접 매개 변수를 전달 방법은 아니지만, 파라미터를 가지는 스토어드 루틴을 이벤트에서 호출 할 수 있습니다.

 CREATE EVENT e_call_myproc
     ON SCHEDULE
       AT CURRENT_TIMESTAMP + INTERVAL 1 DAY
     DO CALL myproc (5, 27);

이벤트의 정의에게 SUPER 권한이 있으면, 그 이벤트는 글로벌 변수의 읽기 및 쓰기가 가능합니다. 이 권한을 부여하면 악용 될 수 있기 때문에 이렇게하면 충분히주의 할 필요가 있습니다.

일반적으로 스토어드 루틴에서 유효한 모든 문을 이벤트에 의해 실행되는 액션 문에 사용할 수 있습니다. 스토어드 루틴 내에서 허용되는 문 자세한 내용은 섹션 20.2.1 "스토어드 루틴 구문" 을 참조하십시오. 스토어드 루틴의 일부로 이벤트를 만들 수 있지만 이벤트를 다른 이벤트로 만들 수 없습니다.

서울시 강남구 영동대로 602 6층
TEL: 02-6061-0006  /  E: csr@mysqlkorea.com
주식회사 이노클러스터  등록번호 : 727-86-02261
Copyright © innocluster Co. ltd. all rights reserved