【SQL篇章--DATABASE/EVENTS】

来源:http://www.cnblogs.com/cuisi/archive/2016/12/01/6122788.html
-Advertisement-
Play Games

【SQL篇章】【SQL語句梳理 :--基於MySQL5.6】【已梳理:DATABASE/EVENTS】【會堅持完善】 ...


【SQL篇章】【SQL語句梳理 :--基於MySQL5.6】【已梳理:DATABASE/EVENTS】【會堅持完善】   目錄: 1. Data Definition Statements:   1.1 create database, alter database, show databases   1.2 create event, alter event, show events     1. Data Definition Statements: 1.1 CREATE DATABASE 格式:
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [create_specification] create_specification :
  [DEFAULT] CHARACTER SET [=] charset_name
  [DEFAULT] COLLATE [=] collation_name

  

事例 :
CREATE DATABASE db2;
CREATE DATABASE `db2` /*!40100 DEFAULT CHARACTER SET latin1 */
  查看:
SHOW DATABASES;
  ALTER DATABASE 格式:
ALTER {DATABASE | SCHEMA} [db_name]
  alter_specification ...
ALTER {DATABASE | SCHEMA} db_name
  UPGRADE DATA DIRECTORY NAME
 
alter_specification:
  [DEFAULT] CHARACTER SET [=] charset_name  | [DEFAULT] COLLATE [=] collation_name

  

  事例操作: <1> -->db1:utf8
ALTER DATABASE db1 CHARACTER SET = utf8;
  查看:
mysql> SELECT * FROM information_schema.`SCHEMATA` WHERE schema_name='db1';
+--------------+-------------+----------------------------+------------------------+----------+
| CATALOG_NAME | SCHEMA_NAME | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME | SQL_PATH |
+--------------+-------------+----------------------------+------------------------+----------+
| def          | db1         | utf8                       | utf8_general_ci        | NULL     |
+--------------+-------------+----------------------------+------------------------+----------+
1 row in set (0.04 sec)

  

<2> -->db1:utf8-->latin1
ALTER DATABASE db1 CHARACTER SET = latin1;

  

查看:
mysql> SELECT * FROM information_schema.`SCHEMATA` WHERE schema_name='db1';
+--------------+-------------+----------------------------+------------------------+----------+
| CATALOG_NAME | SCHEMA_NAME | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME | SQL_PATH |
+--------------+-------------+----------------------------+------------------------+----------+
| def          | db1         | latin1                     | latin1_swedish_ci      | NULL     |
+--------------+-------------+----------------------------+------------------------+----------+
1 row in set (0.00 sec)

  

<3> --創建表t5:  <db1:latin1>
CREATE TABLE t5(id int);

  查看所建立表的字元集

mysql> SHOW CREATE TABLE db1.t5;
+-------+----------------------------------------------------------------------------------------+
| Table | Create Table                                                                           |
+-------+----------------------------------------------------------------------------------------+
| t5    | CREATE TABLE `t5` (
  `id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+----------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

  測試發現:

  1.db的character改變後,collation隨之改變。
  2.db中舊表character不會改變。新建表character預設為與當前db相同。

  

  SHOW DATABASES; 格式: SHOW {DATABASES | SCHEMAS} [LIKE 'pattern' | WHERE expr]   DROP DATABASE; 格式:
DROP {DATABASE | SCHEMA} [IF EXISTS] db_name
    1.IF EXISTS : DB不存在,不會報錯   2.DB drop掉,對應的物理目錄也會刪除。但是DB對應目錄下有其它文件,無法執行drop DB的操作,報錯
mysql> drop database wb;
ERROR 1010 (HY000): Error dropping database (can't rmdir './wb/', errno: 17)

  

刪除非資料庫目錄或文件:
mysql> drop database wb;
Query OK, 0 rows affected (0.00 sec)
 

  

1.2 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}

  

註意事項:
  • 創建event需要:event,super許可權,建好之後,必須是enable狀態。
  • ON SCHEDULE : 決定什麼時間或者多長時間,時間執行一次
  • DO :包含被event執行的SQL語句
預設 EVENT 支持是沒有啟動的,可以通過下麵的命令來查看狀態:
Select @@event_scheduler;

  

如果返回 OFF ,則需要執行下麵的命令啟動:
SET GLOBAL event_scheduler = ON;

  

好了,上面雖然啟動了 EVENT ,但是每次重啟 mysql 之後 EVENT 並沒有自動啟動,那麼如何讓它自動啟動呢? 方法一:找到當前使用的 .cnf 文件
[mysqld] 
event_scheduler=1

  

方法二:啟動 mysql 的時候增加 --event_scheduler=1
mysql start --event_scheduler=1

  

事例: 1.只執行一次
CREATE
DEFINER = CURRENT_USER
EVENT IF NOT EXISTS myevent
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 SECOND
DO
INSERT INTO db1.t1 VALUES(1);

  

2.每隔一秒執行一次
CREATE
DEFINER = CURRENT_USER
EVENT IF NOT EXISTS myevent
ON SCHEDULE EVERY 1 SECOND
DO
INSERT INTO db1.t1 VALUES(1);

  

3.event的執行時間是過去時,在創建時,就drop掉了,當前創建的event是沒有顯示的。
mysql> SELECT NOW();
+---------------------+
| NOW()               |
+---------------------+
| 2016-11-16 10:01:39 |
+---------------------+
1 row in set (0.00 sec)

mysql> CREATE EVENT event_1
    -> 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.
1 row in set (0.00 sec)
  ON SCHEDULE 解析: 1. 'two minutes and three seconds from now'
AT CURRENT_TIMESTAMP + INTERVAL '2:3' MINUTE_SECOND
'three weeks and two days from now'
AT CURRENT_TIMESTAMP + INTERVAL 3 WEEK + INTERVAL 2 DAY
  2. 間隔值頻率相同,可以用EVERY,不與'+INTERVAL'同時存在
ON SCHEDULE EVERY 6 WEEK

 

STARTS: 後面緊接timestamp,指示從什麼時間開始執行repeating,可以用:+ INTERVAL interval 指示:從現在開始經多長時間後開始執行repeating. eg1:'every three months, beginning one week from now':從現在開始1周之後,開始執行,每隔3月的重覆操作。
EVERY 3 MONTH STARTS CURRENT_TIMESTAMP + INTERVAL 1 WEEK means
eg2:'every two weeks, beginning six hours and fifteen minutes from now'
EVERY 2 WEEK STARTS CURRENT_TIMESTAMP + INTERVAL '6:15' HOUR_MINUTE.
  ENDS : 同starts相反,指示從什麼時間停止執行repeating。用法同starts eg: 'every twelve hours, beginning thirty minutes from now, and ending four weeks from now'
EVERY 12 HOUR STARTS CURRENT_TIMESTAMP + INTERVAL 30 MINUTE ENDS CURRENT_TIMESTAMP + INTERVAL 4 WEEK

 

備註:STARTS,ENDS,可以同時使用,也可用其一,也可以使用複雜的時間單元   [ON COMPLETION [NOT] PRESERVE] 解析:
  1. 正常來說,一旦event過期,會立即drop掉。
  2. 可以通過設置:ON COMPLETION PRESERVE,來禁止drop操作。此時,event的狀態從:ENABLE---->DISABLE。EVENT停止執行,保留存在。
  3. 可以通過設置:ON COMLETION NOT PRESERVE,不禁止drop操作,此時,event執行完畢,會立即drop掉。此時看不到event了。
  4. 在不指定時,預設:COMPLETION NOT PRESERVE ENABLE .也就是說,event過期後會自動drop。
測試事例: eg:
CREATE DEFINER=CURRENT_USER EVENT IF NOT EXISTS myevent
ON SCHEDULE EVERY 1 SECOND STARTS CURRENT_TIMESTAMP + INTERVAL 1 MINUTE ENDS CURRENT_TIMESTAMP + INTERVAL 3 MINUTE
DO
INSERT INTO db1.`t1`(id) VALUES(5);
  創建完成,再次查看event:
DELIMITER $$
ALTER DEFINER=`admin`@`%` EVENT `myevent` 
ON SCHEDULE EVERY 1 SECOND STARTS '2016-11-30 16:42:02' ENDS '2016-11-30 16:44:02'
ON COMPLETION NOT PRESERVE ENABLE
DO INSERT INTO db1.`t1`(id) VALUES(5)$$ DELIMITER ;

  

[ENABLE | DISABLE | DISABLE ON SLAVE]解析; 通過設置:ENABLE:啟動event;DISABLE:停止event。在ALTER EVENT時,很常用。 DISABLE ON SLAVE : 設置主從複製時,標示從庫的event的狀態。event會在master上創建,並複製到從庫,但是不會在從庫上執行。   測試事例:
CREATE DEFINER=CURRENT_USER EVENT IF NOT EXISTS myevent
ON SCHEDULE EVERY 1 SECOND STARTS CURRENT_TIMESTAMP + INTERVAL 1 MINUTE ENDS CURRENT_TIMESTAMP + INTERVAL 3 MINUTE
ON COMPLETION PRESERVE ENABLE
DO
INSERT INTO db1.t1(id) VALUES(1);

觀察master 和 slave上event的結構:  

MASTER:
DELIMITER $$
ALTER DEFINER=`admin`@`%` EVENT `myevent` 
ON SCHEDULE EVERY 1 SECOND STARTS '2016-11-16 01:35:40' ENDS '2016-11-16 01:37:40'
ON COMPLETION PRESERVE ENABLE DO INSERT INTO db1.t1(id) VALUES(1)$$ DELIMITER ;

  

SLAVE:
DELIMITER $$
ALTER DEFINER=`admin`@`%` EVENT `myevent` 
ON SCHEDULE EVERY 1 SECOND STARTS '2016-11-16 01:35:40' ENDS '2016-11-16 01:37:40'
ON COMPLETION PRESERVE DISABLE ON SLAVE DO INSERT INTO db1.t1(id) VALUES(1)$$ DELIMITER ;
  通過系統表EVENTS查看狀態 MASTER:
mysql> SELECT EVENT_SCHEMA,EVENT_NAME,STATUS FROM `information_schema`.`EVENTS` WHERE EVENT_SCHEMA='db1';
+--------------+------------+----------+
| EVENT_SCHEMA | EVENT_NAME | STATUS   |
+--------------+------------+----------+
| db1          | myevent    | DISABLED |
+--------------+------------+----------+
1 row in set (0.00 sec) 
SLAVE:
mysql> SELECT EVENT_NAME,STATUS FROM `information_schema`.`EVENTS`;
+------------+--------------------+
| EVENT_NAME | STATUS             |
+------------+--------------------+
| myevent    | SLAVESIDE_DISABLED |
+------------+--------------------+

 

[COMMENT 'comment']解析:

描述EVENT,最多64字元,用引號引起來。   DO 解析: 指定EVENT所執行的動作,可以是任何SQL。   SQL_MODE 解析:
mysql> SELECT SQL_MODE FROM information_schema.`EVENTS`;
+--------------------------------------------+
| SQL_MODE |
+--------------------------------------------+
| STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------+

  

對EVENT執行create ,alter操作時,MYSQL存儲的SQL_MODE系統變數總是被強制設置。 regardless of the current server SQL mode when the event begins executing.   DO 中使用複合語句 select,show 在event中是沒有效果的。但是可以使用:select. . . insert, insert into . . . select 複合語句在event中,可以使用EBGIN,END關鍵字: 1.
DELIMITER $$
CREATE EVENT e_count1
ON SCHEDULE
EVERY 4 SECOND
COMMENT 'Saves total number of tb1'
DO
BEGIN
INSERT INTO t2(TIME,total) SELECT CURRENT_TIMESTAMP,COUNT(*) FROM t1;
DELETE FROM t1;
END $$
DELIMITER ;

  

  2.下麵的event中應用了:本地變數、錯誤處理、流控制結構
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 t3 VALUES(0);
UPDATE t3 SET s1 = s1 + 1;
SET v = v + 1;
END WHILE;
END $$
DELIMITER ;

  

EVENT中調用存儲過程
CREATE EVENT e_call_myproc
ON SCHEDULE
AT CURRENT_TIMESTAMP + INTERVAL 1 DAY
DO CALL myproc(5, 27);
  ALTER EVENT; 格式:
ALTER
[DEFINER = { user | CURRENT_USER }]
EVENT event_name
[ON SCHEDULE schedule]
[ON COMPLETION [NOT] PRESERVE]
[RENAME TO new_event_name]
[ENABLE | DISABLE | DISABLE ON SLAVE]
[COMMENT 'comment']
[DO event_body]

 

事例操作: 主幹語句:ALTER EVENT event_name; 1.前提EVENT必須存在
mysql> alter event event1 on schedule every '2:3' DAY_HOUR ;
ERROR 1539 (HY000): Unknown event 'event1'

  

2.
ALTER EVENT myevent
ON SCHEDULE
EVERY 2 SECOND STARTS CURRENT_TIMESTAMP + INTERVAL 1 MINUTE ENABLE
DO
INSERT INTO t2(TIME,total) VALUES(CURRENT_TIMESTAMP,5);

  

3.停止event
ALTER EVENT myevent DISABLE;

  

4.EVENT改名
ALTER EVENT olddb.myevent RENAME TO newdb.myevent;

  

SHOW EVENTS: 格式:
SHOW EVENTS [{FROM | IN} schema_name] [LIKE 'pattern' | WHERE expr]

  

事例: <1> show events; 列出當前DB中所有events。
mysql> select current_user(),schema();
+-----------------+----------+
| current_user() | schema() |
+-----------------+----------+
| admin@localhost | db1 |
+-----------------+----------+
1 row in set (0.00 sec)

  

mysql> show events\G
*************************** 1. row ***************************
                  Db: db1
                Name: myevent
             Definer: admin@%
           Time zone: SYSTEM
                Type: RECURRING
          Execute at: NULL
      Interval value: 2
      Interval field: SECOND
              Starts: 2016-11-16 08:37:26
                Ends: 2016-11-16 01:44:11
              Status: DISABLED
          Originator: 5
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
1 row in set (0.07 sec)
  <2> 列出指定DB下的events
SHOW EVENTS FROM wb;
SHOW EVENTS FROM wb like '%wb';

  

<3> show events輸出關鍵詞解析:   Type: EVENT的重覆執行類型 ONE TIME (transient) or RECURRING (repeating). Execute:  執行一次的event顯示:AT       重覆執行的event顯示NULL Interval value: 2 一次執行完畢到下次執行時的間隔。 Interval field: SECOND 執行間隔時間單位 Status: event的狀態 Originator MySQL server 的 ID   <4>
SHOW CREATE EVENT event_name;

  

mysql> show create event myevent\G
*************************** 1. row ***************************
Event: myevent
sql_mode: STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
time_zone: SYSTEM
Create Event: CREATE DEFINER=`admin`@`%` EVENT `myevent` 
ON SCHEDULE EVERY 2 SECOND STARTS '2016-11-16 08:37:26' ENDS '2016-11-16 01:44:11'
ON COMPLETION PRESERVE DISABLE
DO insert into t2(Time,total) values(current_timestamp,5) character_set_client: utf8 collation_connection: utf8_general_ci Database Collation: utf8_general_ci 1 row in set (0.00 sec)

  

DROP EVENTS 格式:
DROP EVENT [IF EXISTS] event_name

  

1.刪除不存在的EVENT,報錯
mysql> DROP EVENT E;
ERROR 1539 (HY000): Unknown event 'E'

  

2.EVENT不存在,消除報錯
mysql> DROP EVENT IF EXISTS E;
Query OK, 0 rows affected, 1 warning (0.00 sec)

  

3.EVENT存在,正常刪除
mysql> DROP EVENT e_1;
Query OK, 0 rows affected (0.00 sec)

  

     
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ​關於直播的技術文章不少,成體系的不多。我們將用七篇文章,更系統化地介紹當下大熱的視頻直播各環節的關鍵技術,幫助視頻直播創業者們更全面、深入地瞭解視頻直播技術,更好地技術選型。 本系列文章大綱如下: (一)採集 (二)處理 (三)編碼和封裝 (四)推流和傳輸 (五)延遲優化 (六)現代播放器原理 ( ...
  • 數據是大家的原料,在設計方案、撰寫報告之前,備料很關鍵。常言道巧婦難做無米之炊,我們今天就來聊聊如何採集數據吧。 一、數據特征 所謂時效性是指數據的發生和運用要有個提前期,失去時效性,就失去了潛在機會。 數據的分散性具體表現在兩個方面:1)沒有固定發生地。2)零散分佈,相互關聯才完整。 數據的概率性 ...
  • 1.建表及插入數據,2.使用CASE語句查詢,3.使用PIVOT行轉列,4.PIVOT動態獲取列,5.使用UNPIVOT列轉行 ...
  • 大數據架構開發 挖掘分析 Hadoop HBase Hive Storm Spark Sqoop Flume ZooKeeper Kafka Redis MongoDB 機器學習 雲計算 視頻教程 Java架構師高薪培訓 Web項目 Activiti Dubbo Redis Spring Nutch ...
  • 分析: 資料庫設計應遵循三大範式分別為: 第一範式:確保表中每列的原子性(不可拆分); 第二範式:確保表中每列與主鍵相關,而不能只與主鍵的某部分相關(主要針對聯合主鍵),主鍵列與非主鍵列遵循完全函數依賴關係(完全依賴); 第三範式:非主鍵列之間沒有傳遞函數依賴關係(消除傳遞依賴); 詳述: 第一範式 ...
  • SSDB的性能很突出,與Redis基本相當了,Redis是記憶體型,容量問題是弱項,並且記憶體成本太高,SSDB針對這個弱點,使用硬碟存儲,使用Google高性能的存儲引擎LevelDB,適合大數據量處理並把性能優化到Redis級別,具有Redis的數據結構、相容Redis客戶端,還給出了從Redis遷 ...
  • Procedure & Function Procedure 語法: Function 語法: 官網關於 procedure, function相關文檔: FAQ:http://dev.mysql.com/doc/refman/5.6/en/faqs-stored-procs.html 語法說明:h ...
  • 在SQL Server中,對超級大表做數據歸檔,使用select和delete命令是十分耗費CPU時間和Disk空間的,SQL Server必須記錄相應數量的事務日誌,而使用switch操作歸檔分區表的老數據,十分高效,switch操作不會移動數據,只是做元數據的置換,因此,執行分區切換操作的時間是 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...