### 第23章:INFORMATION_SCHEMA信息數據庫
INFORMATION_SCHEMA提供了訪問數據庫元數據的方式。
元數據是關于數據的數據,如數據庫名或表名,列的數據類型,或訪問權限等。有些時候用于表述該信息的其他術語包括“數據詞典”和“系統目錄”。
例如:
mysql> SELECT table_name, table_type, engine
-> FROM information_schema.tables
-> WHERE table_schema = 'db5'
-> ORDER BY table_name DESC;
<table class="MsoTableGrid" border="1" cellspacing="0" cellpadding="0"><tr><td valign="top"> <pre>?table_name(表名)</pre> </td> <td valign="top"> <pre>?table_type(表類型)</pre> </td> <td valign="top"> <pre>?引擎</pre> </td> </tr><tr><td valign="top"> <pre>?v56? </pre> </td> <td valign="top"> <pre>?VIEW(視圖)</pre> </td> <td valign="top"> <pre>?NULL</pre> </td> </tr><tr><td valign="top"> <pre>?v3</pre> </td> <td valign="top"> <p><span>VIEW</span>(視圖)</p></td> <td valign="top"> <pre>?NULL</pre> </td> </tr><tr><td valign="top"> <pre>?v2</pre> </td> <td valign="top"> <p><span>VIEW</span>(視圖)</p></td> <td valign="top"> <pre>?NULL</pre> </td> </tr><tr><td valign="top"> <pre>?v</pre> </td> <td valign="top"> <p><span>VIEW</span>(視圖)</p></td> <td valign="top"> <pre>?NULL</pre> </td> </tr><tr><td valign="top"> <pre>?tables </pre> </td> <td valign="top"> <pre>?BASE TABLE(基本表)</pre> </td> <td valign="top"> <pre>?MyISAM </pre> </td> </tr><tr><td valign="top"> <pre>?t7</pre> </td> <td valign="top"> <pre>?BASE TABLE(基本表)</pre> </td> <td valign="top"> <pre>?MyISAM </pre> </td> </tr><tr><td valign="top"> <pre>?t3</pre> </td> <td valign="top"> <pre>?BASE TABLE(基本表)</pre> </td> <td valign="top"> <pre>?MyISAM </pre> </td> </tr><tr><td valign="top"> <pre>?t2</pre> </td> <td valign="top"> <pre>?BASE TABLE(基本表)</pre> </td> <td valign="top"> <pre>?MyISAM </pre> </td> </tr><tr><td valign="top"> <pre>?t</pre> </td> <td valign="top"> <pre>?BASE TABLE(基本表)</pre> </td> <td valign="top"> <pre>?MyISAM </pre> </td> </tr><tr><td valign="top"> <pre>?pk</pre> </td> <td valign="top"> <pre>?BASE TABLE(基本表)</pre> </td> <td valign="top"> <pre>?InnoDB </pre> </td> </tr><tr><td valign="top"> <pre>?loop </pre> </td> <td valign="top"> <pre>?BASE TABLE(基本表)</pre> </td> <td valign="top"> <pre>?MyISAM </pre> </td> </tr><tr><td valign="top"> <pre>?kurs </pre> </td> <td valign="top"> <pre>?BASE TABLE(基本表)</pre> </td> <td valign="top"> <pre>?MyISAM </pre> </td> </tr><tr><td valign="top"> <pre>?k</pre> </td> <td valign="top"> <pre>?BASE TABLE(基本表)</pre> </td> <td valign="top"> <pre>?MyISAM </pre> </td> </tr><tr><td valign="top"> <pre>?into </pre> </td> <td valign="top"> <pre>?BASE TABLE(基本表)</pre> </td> <td valign="top"> <pre>?MyISAM </pre> </td> </tr><tr><td valign="top"> <pre>?goto </pre> </td> <td valign="top"> <pre>?BASE TABLE(基本表)</pre> </td> <td valign="top"> <pre>?MyISAM </pre> </td> </tr><tr><td valign="top"> <pre>?fk2? </pre> </td> <td valign="top"> <pre>?BASE TABLE(基本表)</pre> </td> <td valign="top"> <pre>?InnoDB </pre> </td> </tr><tr><td valign="top"> <pre>?fk</pre> </td> <td valign="top"> <pre>?BASE TABLE(基本表)</pre> </td> <td valign="top"> <pre>?InnoDB </pre> </td> </tr></table>
集合中含17行(0.01秒)。
解釋:該語句請求按逆向字母順序列出數據庫db5中的所有表,但僅顯示三種信息:表名,表類型,以及表引擎。
INFORMATION_SCHEMA是信息數據庫,其中保存著關于MySQL服務器所維護的所有其他數據庫的信息。在INFORMATION_SCHEMA中,有數個只讀表。它們實際上是視圖,而不是基本表,因此,你將無法看到與之相關的任何文件。
每位MySQL用戶均有權訪問這些表,但僅限于表中的特定行,在這類行中含有用戶具有恰當訪問權限的對象。
SELECT的優點
SELECT ... FROM INFORMATION_SCHEMA語句的目的在于提供一種更為一致的方式,以訪問MySQL所支持的各種SHOW語句(SHOW
DATABASES、SHOW TABLES等等)提供的信息。與SHOW相比,使用SELECT有多項優點“
?????????
符合Codd規則。也就是說,所有訪問均是在表上進行的。
?????????
不需要了解新語句的語法。由于他們已知道SELECT的工作方式,僅需了解對象名即可。
?????????
實現人無需操心增加關鍵詞方面的事宜。
?????????
有數百萬種可能的輸出變化,而不是一種。這樣,就為對元數據有不同需求的應用程序提供了更高的靈活性。
?????????
由于其他DBMS也采用了這類方式,移植更為容易。
然而,由于SHOW在MySQL的雇員和用戶中十分流行,如果SHOW消失,可能會導致混亂,因此傳統的語法方式無法給出消除SHOW的足夠理由。事實上,在MySQL
5.1中,還對SHOW進行了多項增強。關于這方面的介紹,請參見23.2節,“SHOW語句的擴展``”。
標準
在MySQL中,INFORMATION_SCHEMA表結構的實施遵從“ANSI/ISO
SQL:2003標準,第11部分綱要”。我們的目的在于,獲得與SQL:2003核心特性F021“基本信息方案”的近似兼容。
SQL服務器2000(也遵從該標準)的用戶可能已注意到它們高度的相似性。但是,MySQL略去了與我們的實施方式不相關的眾多列,并添加了一些MySQL特有的列。其中一種列就是INFORMATION_SCHEMA.TABLES表中的引擎列。
盡管其他DBMS使用了不同的名稱,如syscat或系統,但標準名稱是INFORMATION_SCHEMA。
事實上,盡管不需要生成名為INFORMATION_SCHEMA的文件,我們仍提供了名為INFORMATION_SCHEMA的新數據庫。可以使用USE語句將INFORMATION_SCHEMA選擇為默認數據庫,但訪問該數據庫中所含表的唯一方式是使用SELECT語句。不能在其中插入內容,不能更新它們,也不能刪除其中的內容。
權限
當前權限(SHOW)要求和SELCET權限要求不存在差別。在任何一種情況下,要想查看關于它的信息,需要對某類對象擁有特定權限。
23.1.?INFORMATION_SCHEMA表
23.1.1. INFORMATION_SCHEMA SCHEMATA表
23.1.2. INFORMATION_SCHEMA TABLES表
23.1.3. INFORMATION_SCHEMA COLUMNS表
23.1.4. INFORMATION_SCHEMA STATISTICS表
23.1.5. INFORMATION_SCHEMA USER_PRIVILEGES表
23.1.6. INFORMATION_SCHEMA SCHEMA_PRIVILEGES表
23.1.7. INFORMATION_SCHEMA TABLE_PRIVILEGES表
23.1.8. INFORMATION_SCHEMA COLUMN_PRIVILEGES表
23.1.9. INFORMATION_SCHEMA CHARACTER_SETS表
23.1.10. INFORMATION_SCHEMA COLLATIONS表
23.1.11. INFORMATION_SCHEMA
COLLATION_CHARACTER_SET_APPLICABILITY表
23.1.12. INFORMATION_SCHEMA TABLE_CONSTRAINTS表
23.1.13. INFORMATION_SCHEMA KEY_COLUMN_USAGE表
23.1.14. INFORMATION_SCHEMA ROUTINES表
23.1.15. INFORMATION_SCHEMA VIEWS表
23.1.16. INFORMATION_SCHEMA TRIGGERS表
23.1.17. 其他INFORMATION_SCHEMA表
下述章節說明
在下面的章節中,我們選擇了INFORMATION_SCHEMA中的表和列。對于每一列,有三類信息:
?????????
“標準名稱”:指明了列的標準SQL名稱。
?????????
“SHOW名稱”:指明了最近SHOW語句中的等效字段名,如果有的話。
?????????
“注釋”給出了適用的附加信息。
為了避免使用標準或DB2、SQL服務器或Oracle中保留的名稱,我們更改了標注為“SQL擴展”的列名。(例如,在TABLES表中,我們將COLLATION改為TABLE_COLLATION)。請參見本文末尾處給出的保留字列表。http://www.dbazine.com/gulutzan5.shtml。
字符列(例如TABLES.TABLE_NAME)定義通常是VARCHAR(N)
CHARACTER SET utf8,其中,N至少為64。
在每一部分中,指明了等效于從INFORMATION_SCHEMA中檢索信息的SELECT語句的SHOW語句,或者不存在這類語句。
注釋:目前,有一些丟失的列和一些混亂的列。我們正在著手解決該問題,并隨著變化情況更新文檔。
23.1.1.?INFORMATION_SCHEMA SCHEMATA表
該方案是數據庫,因此SCHEMATA表提供了關于數據庫的信息。
標準名稱
SHOW名稱
注釋
CATALOG_NAME
-
NULL
SCHEMA_NAME
?
Database
DEFAULT_CHARACTER_SET_NAME
?
?
DEFAULT_COLLATION_NAME
?
?
SQL_PATH
?
NULL
注釋:SQL_PATH列的之總為NULL。
下述語句是等效的:
SELECT SCHEMA_NAME AS `Database
FROM INFORMATION_SCHEMA.SCHEMATA
[WHERE SCHEMA_NAME LIKE 'wild']
?
SHOW DATABASES
[LIKE 'wild']
### 23.1.2.?INFORMATION_SCHEMA TABLES表
TABLES表給出了關于數據庫中的表的信息。
<table border="1" cellpadding="0" id="table3"><tr><td> <p><strong><span> 標準名稱</span></strong></p></td> <td> <p><span><b>SHOW</b></span><strong><span>名稱</span></strong></p></td> <td> <p><strong><span> 注釋</span></strong></p></td> </tr><tr><td> <p> <span>TABLE_CATALOG</span></p></td> <td> <p><span>?</span></p></td> <td> <p> <span>NULL</span></p></td> </tr><tr><td> <p> <span>TABLE_SCHEMA</span></p></td> <td> <p> <span>Table_</span><span>...</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>TABLE_NAME</span></p></td> <td> <p> <span>Table_</span><span>...</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>TABLE_TYPE</span></p></td> <td> <p><span>?</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>ENGINE</span></p></td> <td> <p> <span>Engine</span></p></td> <td> <p><span>MySQL擴展</span></p></td> </tr><tr><td> <p> <span>VERSION</span></p></td> <td> <p> <span>Version</span></p></td> <td> <p><span>MySQL擴展</span></p></td> </tr><tr><td> <p> <span>ROW_FORMAT</span></p></td> <td> <p> <span>Row_format</span></p></td> <td> <p><span>MySQL擴展</span></p></td> </tr><tr><td> <p> <span>TABLE_ROWS</span></p></td> <td> <p> <span>Rows</span></p></td> <td> <p><span>MySQL擴展</span></p></td> </tr><tr><td> <p> <span>AVG_ROW_LENGTH</span></p></td> <td> <p> <span>Avg_row_length</span></p></td> <td> <p><span>MySQL擴展</span></p></td> </tr><tr><td> <p> <span>DATA_LENGTH</span></p></td> <td> <p> <span>Data_length</span></p></td> <td> <p><span>MySQL擴展</span></p></td> </tr><tr><td> <p> <span>MAX_DATA_LENGTH</span></p></td> <td> <p> <span>Max_data_length</span></p></td> <td> <p><span>MySQL擴展</span></p></td> </tr><tr><td> <p> <span>INDEX_LENGTH</span></p></td> <td> <p> <span>Index_length</span></p></td> <td> <p><span>MySQL擴展</span></p></td> </tr><tr><td> <p> <span>DATA_FREE</span></p></td> <td> <p> <span>Data_free</span></p></td> <td> <p><span>MySQL擴展</span></p></td> </tr><tr><td> <p> <span>AUTO_INCREMENT</span></p></td> <td> <p> <span>Auto_increment</span></p></td> <td> <p><span>MySQL擴展</span></p></td> </tr><tr><td> <p> <span>CREATE_TIME</span></p></td> <td> <p> <span>Create_time</span></p></td> <td> <p><span>MySQL擴展</span></p></td> </tr><tr><td> <p> <span>UPDATE_TIME</span></p></td> <td> <p> <span>Update_time</span></p></td> <td> <p><span>MySQL擴展</span></p></td> </tr><tr><td> <p> <span>CHECK_TIME</span></p></td> <td> <p> <span>Check_time</span></p></td> <td> <p><span>MySQL擴展</span></p></td> </tr><tr><td> <p> <span>TABLE_COLLATION</span></p></td> <td> <p> <span>Collation</span></p></td> <td> <p><span>MySQL擴展</span></p></td> </tr><tr><td> <p> <span>CHECKSUM</span></p></td> <td> <p> <span>Checksum</span></p></td> <td> <p><span>MySQL擴展</span></p></td> </tr><tr><td> <p> <span>CREATE_OPTIONS</span></p></td> <td> <p> <span>Create_options</span></p></td> <td> <p><span>MySQL擴展</span></p></td> </tr><tr><td> <p> <span>TABLE_COMMENT</span></p></td> <td> <p> <span>Comment</span></p></td> <td> <p><span>MySQL擴展</span></p></td> </tr></table>
注釋:
????????? TABLE_SCHEMA和TABLE_NAME是SHOW顯示中的單個字段,例如Table_in_db1。
????????? TABLE_TYPE(表類型)應是BASE TABLE(基本表)或VIEW(視圖)。如果表是臨時性的,TABLE_TYPE = TEMPORARY。(沒有臨時視圖,因此,因此不存在歧義)。
????????? 如果表位于INFORMATION_SCHEMA數據庫中,TABLE_ROWS列為NULL。對于InnoDB表,在SQL優化中,行計數僅是大概估計值。
????????? 沒有關于表默認字符集的任何信息。TABLE_COLLATION處于關閉狀態,原因在于校對名稱以字符集名稱開頭。
下述語句是等效的:
SELECT table_name FROM INFORMATION_SCHEMA.TABLES
? [WHERE table_schema = 'db_name']
? [WHERE|AND table_name LIKE 'wild']
?
SHOW TABLES
? [FROM db_name]
? [LIKE 'wild']
### 23.1.3.?INFORMATION_SCHEMA COLUMNS表
COLUMNS表給出了表中的列信息。
<table border="1" cellpadding="0" id="table4"><tr><td> <p><strong><span> 標準名稱</span></strong></p></td> <td> <p><span><b>SHOW</b></span><strong><span>名稱</span></strong></p></td> <td> <p><strong><span> 注釋</span></strong></p></td> </tr><tr><td> <p> <span>TABLE_CATALOG</span></p></td> <td> <p><span>?</span></p></td> <td> <p> <span>NULL</span></p></td> </tr><tr><td> <p> <span>TABLE_SCHEMA</span></p></td> <td> <p><span>?</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>TABLE_NAME</span></p></td> <td> <p><span>?</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>COLUMN_NAME</span></p></td> <td> <p> <span>Field</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>ORDINAL_POSITION</span></p></td> <td> <p><span>?</span></p></td> <td> <p>參見注釋</p></td> </tr><tr><td> <p> <span>COLUMN_DEFAULT</span></p></td> <td> <p> <span>Default</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>IS_NULLABLE</span></p></td> <td> <p> <span>Null</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>DATA_TYPE</span></p></td> <td> <p> <span>Type</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>CHARACTER_MAXIMUM_LENGTH</span></p></td> <td> <p> <span>Type</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>CHARACTER_OCTET_LENGTH</span></p></td> <td> <p><span>?</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>NUMERIC_PRECISION</span></p></td> <td> <p> <span>Type</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>NUMERIC_SCALE</span></p></td> <td> <p> <span>Type</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>CHARACTER_SET_NAME</span></p></td> <td> <p><span>?</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>COLLATION_NAME</span></p></td> <td> <p> <span>Collation</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>COLUMN_TYPE</span></p></td> <td> <p> <span>Type</span></p></td> <td> <p><span>MySQL擴展</span></p></td> </tr><tr><td> <p> <span>COLUMN_KEY</span></p></td> <td> <p> <span>Key</span></p></td> <td> <p><span>MySQL擴展</span></p></td> </tr><tr><td> <p> <span>EXTRA</span></p></td> <td> <p> <span>Extra</span></p></td> <td> <p><span>MySQL擴展</span></p></td> </tr><tr><td> <p> <span>COLUMN_COMMENT</span></p></td> <td> <p> <span>Comment</span></p></td> <td> <p><span>MySQL擴展</span></p></td> </tr></table>
注釋:
????????? 在SHOW中,類型顯示包括來自數個不同COLUMNS列的值。
????????? ORDINAL_POSITION有必要,這是因為,你可能會在某一天需要ORDER BY ORDINAL_POSITION(按ORDINAL_POSITION排序)。不同于SHOW,SELECT沒有自動排序功能。
????????? CHARACTER_OCTET_LENGTH應與CHARACTER_MAXIMUM_LENGTH相同,但多字節字符集除外。
????????? CHARACTER_SET_NAME可由Collation(校對)導出。例如,如果給出了“SHOW FULL COLUMNS FROM t”,在Collation(校對)列中將見到latin1_swedish_ci的值,字符集由第1個下劃線前的名稱指明。latin1.
下述語句是等效的:
SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT
? FROM INFORMATION_SCHEMA.COLUMNS
? WHERE table_name = 'tbl_name'
?[AND table_schema = 'db_name']
?[AND column_name LIKE 'wild']
?
SHOW COLUMNS
?FROM tbl_name
? [FROM db_name]
? [LIKE wild]
### 23.1.4.?INFORMATION_SCHEMA STATISTICS表
STATISTICS表給出了關于表索引的信息。
<table border="1" cellpadding="0" id="table5"><tr><td> <p><strong><span> 標準名稱</span></strong></p></td> <td> <p><span><b>SHOW</b></span><strong><span>名稱</span></strong></p></td> <td> <p><strong><span> 注釋</span></strong></p></td> </tr><tr><td> <p> <span>TABLE_CATALOG</span></p></td> <td> <p><span>?</span></p></td> <td> <p> <span>NULL</span></p></td> </tr><tr><td> <p> <span>TABLE_SCHEMA</span></p></td> <td> <p><span>?</span></p></td> <td> <p>=數據庫</p></td> </tr><tr><td> <p> <span>TABLE_NAME</span></p></td> <td> <p> <span>Table</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>NON_UNIQUE</span></p></td> <td> <p> <span>Non_unique</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>INDEX_SCHEMA</span></p></td> <td> <p><span>?</span></p></td> <td> <p>=數據庫</p></td> </tr><tr><td> <p> <span>INDEX_NAME</span></p></td> <td> <p> <span>Key_name</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>SEQ_IN_INDEX</span></p></td> <td> <p> <span>Seq_in_index</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>COLUMN_NAME</span></p></td> <td> <p> <span>Column_name</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>COLLATION</span></p></td> <td> <p> <span>Collation</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>CARDINALITY</span></p></td> <td> <p> <span>Cardinality</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>SUB_PART</span></p></td> <td> <p> <span>Sub_part</span></p></td> <td> <p>MySQL擴展</p></td> </tr><tr><td> <p> <span>PACKED</span></p></td> <td> <p> <span>Packed</span></p></td> <td> <p>MySQL擴展</p></td> </tr><tr><td> <p> <span>NULLABLE</span></p></td> <td> <p> <span>Null</span></p></td> <td> <p>MySQL擴展</p></td> </tr><tr><td> <p> <span>INDEX_TYPE</span></p></td> <td> <p> <span>Index_type</span></p></td> <td> <p>MySQL擴展</p></td> </tr><tr><td> <p> <span>COMMENT</span></p></td> <td> <p> <span>Comment</span></p></td> <td> <p>MySQL擴展</p></td> </tr></table>
注釋:
????????? 沒有關于這些索引的標準表。上面的列表與SQL服務器2000中sp_statistics返回的值類似。不同之處在于用CATALOG替換了QUALIFIER,并用SCHEMA替換了OWNER。
顯而易見,前述表和SHOW INDEX的輸出均是由相同的父對象導出的。因此,相關性已關閉。
下述語句是等效的:
SELECT * FROM INFORMATION_SCHEMA.STATISTICS
? WHERE table_name = 'tbl_name'
?[AND table_schema = 'db_name']
?
SHOW INDEX
?FROM tbl_name
? [FROM db_name]
### 23.1.5.?INFORMATION_SCHEMA USER_PRIVILEGES表
USER_PRIVILEGES(用戶權限)表給出了關于全程權限的信息。該信息源自mysql.user授權表。
<table border="1" cellpadding="0" id="table6"><tr><td> <p><strong><span> 標準名稱</span></strong></p></td> <td> <p><span><b>SHOW</b></span><strong><span>名稱</span></strong></p></td> <td> <p><strong><span> 注釋</span></strong></p></td> </tr><tr><td> <p> <span>GRANTEE</span></p></td> <td> <p><span>?</span></p></td> <td> <p>例如“user'@'host”</p></td> </tr><tr><td> <p> <span>TABLE_CATALOG</span></p></td> <td> <p><span>?</span></p></td> <td> <p> <span>NULL</span></p></td> </tr><tr><td> <p> <span>PRIVILEGE_TYPE</span></p></td> <td> <p><span>?</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>IS_GRANTABLE</span></p></td> <td> <p><span>?</span></p></td> <td> <p><span>?</span></p></td> </tr></table>
注釋:
????????? 這是一個非標準表。其值來自mysql.user表。
### 23.1.6.?INFORMATION_SCHEMA SCHEMA_PRIVILEGES表
SCHEMA_PRIVILEGES(方案權限)表給出了關于方案(數據庫)權限的信息。該信息來自mysql.db授權表。
<table border="1" cellpadding="0" id="table7"><tr><td> <p><strong><span> 標準名稱</span></strong></p></td> <td> <p><span><b>SHOW</b></span><strong><span>名稱</span></strong></p></td> <td> <p><strong><span> 注釋</span></strong></p></td> </tr><tr><td> <p> <span>GRANTEE</span></p></td> <td> <p><span>?</span></p></td> <td> <p>例如“user'@'host”</p></td> </tr><tr><td> <p> <span>TABLE_CATALOG</span></p></td> <td> <p><span>?</span></p></td> <td> <p> <span>NULL</span></p></td> </tr><tr><td> <p> <span>TABLE_SCHEMA</span></p></td> <td> <p><span>?</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>PRIVILEGE_TYPE</span></p></td> <td> <p><span>?</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>IS_GRANTABLE</span></p></td> <td> <p><span>?</span></p></td> <td> <p><span>?</span></p></td> </tr></table>
注釋:
????????? 這是一個非標準表。其值來自mysql.db表。
### 23.1.7.?INFORMATION_SCHEMA TABLE_PRIVILEGES表
TABLE_PRIVILEGES(表權限)表給出了關于表權限的信息。該信息源自mysql.tables_priv授權表。
<table border="1" cellpadding="0" id="table8"><tr><td> <p><strong><span> 標準名稱</span></strong></p></td> <td> <p><span><b>SHOW</b></span><strong><span>名稱</span></strong></p></td> <td> <p><strong><span> 注釋</span></strong></p></td> </tr><tr><td> <p> <span>GRANTEE</span></p></td> <td> <p><span>?</span></p></td> <td> <p>例如“user'@'host”</p></td> </tr><tr><td> <p> <span>TABLE_CATALOG</span></p></td> <td> <p><span>?</span></p></td> <td> <p> <span>NULL</span></p></td> </tr><tr><td> <p> <span>TABLE_SCHEMA</span></p></td> <td> <p><span>?</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>TABLE_NAME</span></p></td> <td> <p><span>?</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>PRIVILEGE_TYPE</span></p></td> <td> <p><span>?</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>IS_GRANTABLE</span></p></td> <td> <p><span>?</span></p></td> <td> <p><span>?</span></p></td> </tr></table>
下述語句不等效:
SELECT ... FROM INFORMATION_SCHEMA.TABLE_PRIVILEGES
?
SHOW GRANTS ...
PRIVILEGE_TYPE可以包含這些值之一(僅能一個):SELECT、INSERT、UPDATE、REFERENCES、ALTER、INDEX、DROP、CREATE VIEW。
### 23.1.8.?INFORMATION_SCHEMA COLUMN_PRIVILEGES表
COLUMN_PRIVILEGES(列權限)表給出了關于列權限的信息。該信息源自mysql.columns_priv授權表。
<table border="1" cellpadding="0" id="table9"><tr><td> <p><strong><span> 標準名稱</span></strong></p></td> <td> <p><span><b>SHOW</b></span><strong><span>名稱</span></strong></p></td> <td> <p><strong><span> 注釋</span></strong></p></td> </tr><tr><td> <p> <span>GRANTEE</span></p></td> <td> <p><span>?</span></p></td> <td> <p>例如“user'@'host”</p></td> </tr><tr><td> <p> <span>TABLE_CATALOG</span></p></td> <td> <p><span>?</span></p></td> <td> <p> <span>NULL</span></p></td> </tr><tr><td> <p> <span>TABLE_SCHEMA</span></p></td> <td> <p><span>?</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>TABLE_NAME</span></p></td> <td> <p><span>?</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>COLUMN_NAME</span></p></td> <td> <p><span>?</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>PRIVILEGE_TYPE</span></p></td> <td> <p><span>?</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>IS_GRANTABLE</span></p></td> <td> <p><span>?</span></p></td> <td> <p><span>?</span></p></td> </tr></table>
注釋:
????????? 在SHOW FULL COLUMNS(顯示完整列)的輸出中,權限值位于一個字段并采用小寫形式,例如select、insert、update、references。在COLUMN_PRIVILEGES中,每種權限占一行,并為大寫形式。
????????? PRIVILEGE_TYPE可以包含這些值之一(僅能一個):SELECT, INSERT, UPDATE, REFERENCES.
????????? 如果用戶有GRANT OPTION權限,那么IS_GRANTABLE應為YES。否則,IS_GRANTABLE應為NO。在輸出中,不會將GRANT OPTION作為單獨權限列出。
下述語句不等效:
SELECT ... FROM INFORMATION_SCHEMA.COLUMN_PRIVILEGES
?
SHOW GRANTS ...
### 23.1.9.?INFORMATION_SCHEMA CHARACTER_SETS表
CHARACTER_SETS(字符集)表提供了關于可用字符集的信息。
<table border="1" cellpadding="0" id="table10"><tr><td> <p><strong><span> 標準名稱</span></strong></p></td> <td> <p><span><b>SHOW</b></span><strong><span>名稱</span></strong></p></td> <td> <p><strong><span> 注釋</span></strong></p></td> </tr><tr><td> <p> <span>CHARACTER_SET_NAME</span></p></td> <td> <p> <span>Charset</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>DEFAULT_COLLATE_NAME</span></p></td> <td> <p> <span>Default collation</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>DESCRIPION</span></p></td> <td> <p> <span>Description</span></p></td> <td> <p>MySQL擴展</p></td> </tr><tr><td> <p> <span>MAXLEN</span></p></td> <td> <p> <span>Maxlen</span></p></td> <td> <p>MySQL擴展</p></td> </tr></table>
注釋:
????????? 我們增加了兩個非標準列,分別對應于SHOW CHARACTER SET輸出的Description(描述)和Maxlen(最大長度)列。
下述語句是等效的:
SELECT * FROM INFORMATION_SCHEMA.CHARACTER_SETS
? [WHERE name LIKE 'wild']
?
SHOW CHARACTER SET
? [LIKE 'wild']
### 23.1.10.?INFORMATION_SCHEMA COLLATIONS表
COLLATIONS表提供了關于各字符集的對照信息。
<table border="1" cellpadding="0" id="table11"><tr><td> <p><strong><span> 標準名稱</span></strong></p></td> <td> <p><span><b>SHOW</b></span><strong><span>名稱</span></strong></p></td> <td> <p><strong><span> 注釋</span></strong></p></td> </tr><tr><td> <p> <span>COLLATION_NAME</span></p></td> <td> <p> <span>Collation</span></p></td> <td> <p><span>?</span></p></td> </tr></table>
注釋:
????????? 我們增加了5個非標準列,分別對應于SHOW COLLATION輸出的Charset、Id、Default、Compiled和Sortlen列。
下述語句是等效的:
SELECT COLLATION_NAME FROM INFORMATION_SCHEMA.COLLATIONS
? [WHERE collation_name LIKE 'wild']
?
SHOW COLLATION
? [LIKE 'wild']
### 23.1.11.?INFORMATION_SCHEMA COLLATION_CHARACTER_SET_APPLICABILITY表
COLLATION_CHARACTER_SET_APPLICABILITY表指明了可用于校對的字符集。這些列等效于SHOW COLLATION的前兩個顯示字段。
<table border="1" cellpadding="0" id="table12"><tr><td> <p><strong><span> 標準名稱</span></strong></p></td> <td> <p><span><b>SHOW</b></span><strong><span>名稱</span></strong></p></td> <td> <p><strong><span> 注釋</span></strong></p></td> </tr><tr><td> <p> <span>COLLATION_NAME</span></p></td> <td> <p> <span>Collation</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>CHARACTER_SET_NAME</span></p></td> <td> <p> <span>Charset</span></p></td> <td> <p><span>?</span></p></td> </tr></table>
### 23.1.12.?INFORMATION_SCHEMA TABLE_CONSTRAINTS表
TABLE_CONSTRAINTS表描述了存在約束的表。
<table border="1" cellpadding="0" id="table13"><tr><td> <p><strong><span> 標準名稱</span></strong></p></td> <td> <p><span><b>SHOW</b></span><strong><span>名稱</span></strong></p></td> <td> <p><strong><span> 注釋</span></strong></p></td> </tr><tr><td> <p> <span>CONSTRAINT_CATALOG</span></p></td> <td> <p><span>?</span></p></td> <td> <p> <span>NULL</span></p></td> </tr><tr><td> <p> <span>CONSTRAINT_SCHEMA</span></p></td> <td> <p><span>?</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>CONSTRAINT_NAME</span></p></td> <td> <p><span>?</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>TABLE_SCHEMA</span></p></td> <td> <p><span>?</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>TABLE_NAME</span></p></td> <td> <p><span>?</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>CONSTRAINT_TYPE</span></p></td> <td> <p><span>?</span></p></td> <td> <p><span>?</span></p></td> </tr></table>
注釋:
????????? CONSTRAINT_TYPE的值可以是UNIQUE(唯一)、PRIMARY KEY(主鍵)或FOREIGN KEY(外鍵)。
????????? 當Non_unique字段為0時,UNIQUE和PRIMARY KEY信息與SHOW INDEX輸出的Key_name字段中給出的信息基本相同。
????????? CONSTRAINT_TYPE列可包含下述值之一:UNIQUE、PRIMARY KEY、FOREIGN KEY、CHECK。這是一個CHAR(非ENUM)列。在我們支持CHECK前,CHECK值不可用。
### 23.1.13.?INFORMATION_SCHEMA KEY_COLUMN_USAGE表
KEY_COLUMN_USAGE表描述了具有約束的鍵列。
<table border="1" cellpadding="0" id="table14"><tr><td> <p><strong><span> 標準名稱</span></strong></p></td> <td> <p><span><b>SHOW</b></span><strong><span>名稱</span></strong></p></td> <td> <p><strong><span> 注釋</span></strong></p></td> </tr><tr><td> <p> <span>CONSTRAINT_CATALOG</span></p></td> <td> <p><span>?</span></p></td> <td> <p> <span>NULL</span></p></td> </tr><tr><td> <p> <span>CONSTRAINT_SCHEMA</span></p></td> <td> <p><span>?</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>CONSTRAINT_NAME</span></p></td> <td> <p><span>?</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>TABLE_CATALOG</span></p></td> <td> <p><span>?</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>TABLE_SCHEMA</span></p></td> <td> <p><span>?</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>TABLE_NAME</span></p></td> <td> <p><span>?</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>COLUMN_NAME</span></p></td> <td> <p><span>?</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>ORDINAL_POSITION</span></p></td> <td> <p><span>?</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>POSITION_IN_UNIQUE_CONSTRAINT</span></p></td> <td> <p><span>?</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>REFERENCED_TABLE_SCHEMA</span></p></td> <td> <p><span>?</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>REFERENCED_TABLE_NAME</span></p></td> <td> <p><span>?</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>REFERENCED_COLUMN_NAME</span></p></td> <td> <p><span>?</span></p></td> <td> <p><span>?</span></p></td> </tr></table>
注釋:
????????? 如果約束為外鍵,這就是外鍵列,而不是外鍵引用的列。
????????? ORDINAL_POSITION的值是列在約束中的位置,而不是列在表中的位置。列位置采用從1開始的數值編號。
????????? 對于“唯一”和“主鍵”約束,POSITION_IN_UNIQUE_CONSTRAINT的值為NULL。對于“外鍵”約束,它是所引用表內鍵中的順序位置。
例如,假定有兩個具有下述定義的表t1和t3:
CREATE TABLE t1
(
s1 INT,
s2 INT,
s3 INT,
PRIMARY KEY(s3)
) ENGINE=InnoDB;
?
CREATE TABLE t3
(
s1 INT,
s2 INT,
s3 INT,
KEY(s1),
CONSTRAINT CO FOREIGN KEY (s2) REFERENCES t1(s3)
) ENGINE=InnoDB;
對于這兩個表,KEY_COLUMN_USAGE表有兩行:
o??????? 一行含有CONSTRAINT_NAME='PRIMARY', TABLE_NAME='t1', COLUMN_NAME='s3', ORDINAL_POSITION=1, POSITION_IN_UNIQUE_CONSTRAINT=NULL。
o??????? 另一行含有CONSTRAINT_NAME='CO', TABLE_NAME='t3', COLUMN_NAME='s2', ORDINAL_POSITION=1, POSITION_IN_UNIQUE_CONSTRAINT=1。
### 23.1.14.?INFORMATION_SCHEMA ROUTINES表
ROUTINES表提供了關于存儲子程序(存儲程序和函數)的信息。此時,ROUTINES表不包含自定義函數(UDF)。
名為“mysql.proc name”的列指明了對應于INFORMATION_SCHEMA.ROUTINES表的mysql.proc表列,如果有的話。
<table border="1" cellpadding="0" id="table15"><tr><td> <p><strong><span> 標準名稱</span></strong></p></td> <td> <p><span><b> mysql.proc</b></span><strong><span>名</span></strong></p></td> <td> <p><strong><span> 注釋</span></strong></p></td> </tr><tr><td> <p> <span>SPECIFIC_NAME</span></p></td> <td> <p> <span>specific_name</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>ROUTINE_CATALOG</span></p></td> <td> <p><span>?</span></p></td> <td> <p> <span>NULL</span></p></td> </tr><tr><td> <p> <span>ROUTINE_SCHEMA</span></p></td> <td> <p> <span>db</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>ROUTINE_NAME</span></p></td> <td> <p> <span>name</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>ROUTINE_TYPE</span></p></td> <td> <p> <span>type</span></p></td> <td> <p> <span>{PROCEDURE|FUNCTION}</span></p></td> </tr><tr><td> <p> <span>DTD_IDENTIFIER</span></p></td> <td> <p><span>?</span></p></td> <td> <p>(數據類型描述符)</p></td> </tr><tr><td> <p> <span>ROUTINE_BODY</span></p></td> <td> <p><span>?</span></p></td> <td> <p> <span>SQL</span></p></td> </tr><tr><td> <p> <span>ROUTINE_DEFINITION</span></p></td> <td> <p> <span>body</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>EXTERNAL_NAME</span></p></td> <td> <p><span>?</span></p></td> <td> <p> <span>NULL</span></p></td> </tr><tr><td> <p> <span>EXTERNAL_LANGUAGE</span></p></td> <td> <p> <span>language</span></p></td> <td> <p> <span>NULL</span></p></td> </tr><tr><td> <p> <span>PARAMETER_STYLE</span></p></td> <td> <p><span>?</span></p></td> <td> <p> <span>SQL</span></p></td> </tr><tr><td> <p> <span>IS_DETERMINISTIC</span></p></td> <td> <p> <span>is_deterministic</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>SQL_DATA_ACCESS</span></p></td> <td> <p> <span>sql_data_access</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>SQL_PATH</span></p></td> <td> <p><span>?</span></p></td> <td> <p> <span>NULL</span></p></td> </tr><tr><td> <p> <span>SECURITY_TYPE</span></p></td> <td> <p> <span>security_type</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>CREATED</span></p></td> <td> <p> <span>created</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>LAST_ALTERED</span></p></td> <td> <p> <span>modified</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>SQL_MODE</span></p></td> <td> <p> <span>sql_mode</span></p></td> <td> <p>MySQL擴展</p></td> </tr><tr><td> <p> <span>ROUTINE_COMMENT</span></p></td> <td> <p> <span>comment</span></p></td> <td> <p>MySQL擴展</p></td> </tr><tr><td> <p> <span>DEFINER</span></p></td> <td> <p> <span>definer</span></p></td> <td> <p>MySQL擴展</p></td> </tr></table>
注釋:
????????? MySQL計算EXTERNAL_LANGUAGE,因此:
o??????? 如果mysql.proc.language='SQL',那么EXTERNAL_LANGUAGE為NULL。
o??????? 否則,EXTERNAL_LANGUAGE為mysql.proc.language中的值。然而,由于尚沒有外部語言,因此該值總為NULL。
### 23.1.15.?INFORMATION_SCHEMA VIEWS表
VIEWS表給出了關于數據庫中的視圖的信息。
<table border="1" cellpadding="0" id="table16"><tr><td> <p><strong><span> 標準名稱</span></strong></p></td> <td> <p><span><b>SHOW</b></span><strong><span>名稱</span></strong></p></td> <td> <p><strong><span> 注釋</span></strong></p></td> </tr><tr><td> <p> <span>TABLE_CATALOG</span></p></td> <td> <p><span>?</span></p></td> <td> <p> <span>NULL</span></p></td> </tr><tr><td> <p> <span>TABLE_SCHEMA</span></p></td> <td> <p><span>?</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>TABLE_NAME</span></p></td> <td> <p><span>?</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>VIEW_DEFINITION</span></p></td> <td> <p><span>?</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>CHECK_OPTION</span></p></td> <td> <p><span>?</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>IS_UPDATABLE</span></p></td> <td> <p><span>?</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>DEFINER</span></p></td> <td> <p><span>?</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>SECURITY_TYPE</span></p></td> <td> <p><span>?</span></p></td> <td> <p><span>?</span></p></td> </tr></table>
注釋:
????????? 有一種新的權限SHOW VIEW,如果沒有它,將無法看到VIEWS表。
????????? VIEW_DEFINITION列含有你在SHOW CREATE VIEW所生成的Create Table字段中見到的大多數信息。跳過SELECT前的單詞,并跳過具有CHECK OPTION(檢查選項)的單詞。例如,如果初始語句是:
???????????????? CREATE VIEW v AS
???????????????? ??SELECT s2,s1 FROM t
???????????????? ??WHERE s1 > 5
???????????????? ??ORDER BY s1
???????????????? ??WITH CHECK OPTION;
那么視圖定義為:
SELECT s2,s1 FROM t WHERE s1 > 5 ORDER BY s1
????????? CHECK_OPTION列的值總為NONE。
????????? 如果視圖是可更新的,IS_UPDATABLE列的值為YES,如果視圖是不可更新的,IS_UPDATABLE列的值為NO。
????????? DEFINER列指明了定義視圖的人。SECURITY_TYPE的值為DEFINER或INVOKER。
### 23.1.16.?INFORMATION_SCHEMA TRIGGERS表
TRIGGERS表提供了關于觸發程序的信息。
必須有SUPER權限才能查看該表。
<table border="1" cellpadding="0" id="table17"><tr><td> <p><strong><span> 標準名稱</span></strong></p></td> <td> <p><span><b>SHOW</b></span><strong><span>名稱</span></strong></p></td> <td> <p><strong><span> 注釋</span></strong></p></td> </tr><tr><td> <p> <span>TRIGGER_CATALOG</span></p></td> <td> <p><span>?</span></p></td> <td> <p> <span>NULL</span></p></td> </tr><tr><td> <p> <span>TRIGGER_SCHEMA</span></p></td> <td> <p><span>?</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>TRIGGER_NAME</span></p></td> <td> <p> <span>Trigger</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>EVENT_MANIPULATION</span></p></td> <td> <p> <span>Event</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>EVENT_OBJECT_CATALOG</span></p></td> <td> <p><span>?</span></p></td> <td> <p> <span>NULL</span></p></td> </tr><tr><td> <p> <span>EVENT_OBJECT_SCHEMA</span></p></td> <td> <p><span>?</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>EVENT_OBJECT_TABLE</span></p></td> <td> <p> <span>Table</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>ACTION_ORDER</span></p></td> <td> <p><span>?</span></p></td> <td> <p> <span>0</span></p></td> </tr><tr><td> <p> <span>ACTION_CONDITION</span></p></td> <td> <p><span>?</span></p></td> <td> <p> <span>NULL</span></p></td> </tr><tr><td> <p> <span>ACTION_STATEMENT</span></p></td> <td> <p> <span>Statement</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>ACTION_ORIENTATION</span></p></td> <td> <p><span>?</span></p></td> <td> <p> <span>ROW</span></p></td> </tr><tr><td> <p> <span>ACTION_TIMING</span></p></td> <td> <p> <span>Timing</span></p></td> <td> <p><span>?</span></p></td> </tr><tr><td> <p> <span>ACTION_REFERENCE_OLD_TABLE</span></p></td> <td> <p><span>?</span></p></td> <td> <p> <span>NULL</span></p></td> </tr><tr><td> <p> <span>ACTION_REFERENCE_NEW_TABLE</span></p></td> <td> <p><span>?</span></p></td> <td> <p> <span>NULL</span></p></td> </tr><tr><td> <p> <span>ACTION_REFERENCE_OLD_ROW</span></p></td> <td> <p><span>?</span></p></td> <td> <p> <span>OLD</span></p></td> </tr><tr><td> <p> <span>ACTION_REFERENCE_NEW_ROW</span></p></td> <td> <p><span>?</span></p></td> <td> <p> <span>NEW</span></p></td> </tr><tr><td> <p> <span>CREATED</span></p></td> <td> <p><span>?</span></p></td> <td> <p> <span>NULL</span><span> (<span>0</span>)</span></p></td> </tr><tr><td> <p> <span>SQL_MODE</span></p></td> <td> <p><span>?</span></p></td> <td> <p><span>?</span></p></td> </tr></table>
注釋:
????????? TRIGGER_SCHEMA和TRIGGER_NAME列中分別含有相應數據庫的名稱以及觸發程序的名稱,在該數據庫中,含有該觸發程序。
????????? EVENT_MANIPULATION列含有下述值之一:INSERT、DELETE、或UPDATE。
????????? 正如[第21章:](#)[_觸發程序_](# "Chapter?21.?Triggers")中指出的那樣,每個觸發程序均與一個表準確相關。EVENT_OBJECT_SCHEMA和EVENT_OBJECT_TABLE列包含相應的數據庫和表名,在該數據庫中,含有該表。
????????? ACTION_ORDER語句含有觸發程序動作(在相同表上所有類似觸發程序列表中)的順序位置。目前該值總為0,這是因為在相同表上具有相同EVENT_MANIPULATION和ACTION_TIMING的觸發程序不能超過1個。
????????? ACTION_STATEMENT列含有激活了觸發程序時將要執行的語句。這與SHOW TRIGGERS輸出的Statement(語句)列中顯示的文本相同。注意,該文本采用了UTF-8編碼方式。
????????? ACTION_ORIENTATION列總含有值“ROW”。
????????? ACTION_TIMING列含有下述兩種值之一:“BEFORE”或“AFTER”。
????????? 列ACTION_REFERENCE_OLD_ROW和ACTION_REFERENCE_NEW_ROW分別含有舊的和新的列標識符。這意味著ACTION_REFERENCE_OLD_ROW總含有值“OLD”,ACTION_REFERENCE_NEW_ROW總含有值“NEW”。
????????? SQL_MODE列顯示了創建觸發程序時有效的服務器SQL模式(無論當前的服務器SQL模式為何,只要激活了觸發程序,它將保持有效)。該列的可能取值范圍與sql_mode系統變量的取值范圍相同。請參見[5.3.2節,“SQL服務器模式”](# "5.3.2.?The Server SQL Mode")。
????????? 在下述列中,目前總含有NULL:TRIGGER_CATALOG,EVENT_OBJECT_CATALOG,ACTION_CONDITION,ACTION_REFERENCE_OLD_TABLE,ACTION_REFERENCE_NEW_TABLE和CREATED。
例如,使用[21.3節,“使用觸發程序”](# "21.3.?Using Triggers")中定義的觸發程序ins_sum。
mysql> SELECT * FROM INFORMATION_SCHEMA.TRIGGERS\G
*************************** 1. row ***************************
TRIGGER_CATALOG: NULL
TRIGGER_SCHEMA: test
TRIGGER_NAME: ins_sum
? EVENT_MANIPULATION: INSERT
EVENT_OBJECT_CATALOG: NULL
EVENT_OBJECT_SCHEMA: test
? EVENT_OBJECT_TABLE: account
ACTION_ORDER: 0
ACTION_CONDITION: NULL
ACTION_STATEMENT:? SET @sum = @sum + NEW.amount
? ACTION_ORIENTATION: ROW
ACTION_TIMING: BEFORE
ACTION_REFERENCE_OLD_TABLE: NULL
ACTION_REFERENCE_NEW_TABLE: NULL
? ACTION_REFERENCE_OLD_ROW: OLD
? ACTION_REFERENCE_NEW_ROW: NEW
CREATED: NULL
1 row in set (1.54 sec)
另請參見[13.5.4.20節,“SHOW TRIGGERS語法”](# "13.5.4.20.?SHOW TRIGGERS Syntax")。
### 23.1.17.?其他INFORMATION_SCHEMA表
我們打算實施附加的INFORMATION_SCHEMA表。尤其是,我們確認了對INFORMATION_SCHEMA.PARAMETERS和INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS的需求。
### 23.2.?SHOW語句的擴展``
某些SHOW語句的擴展伴隨著INFORMATION_SCHEMA的實施:
????????? SHOW可用于獲取關于INFORMATION_SCHEMA本身結構的信息。
????????? 一些SHOW語句允許使用WHERE子句,這樣,在指定需要顯示的行時,可更為靈活。
INFORMATION_SCHEMA是一種信息數據庫,因此,在SHOW DATABASES的輸出中,包含其名稱。與此類似,SHOW TABLES可與INFORMATION_SCHEMA一起使用,以獲取表清單。
mysql> SHOW TABLES FROM INFORMATION_SCHEMA;
+---------------------------------------+
| Tables_in_information_schema|
+---------------------------------------+
| SCHEMATA|
| TABLES|
| COLUMNS |
| CHARACTER_SETS |
| COLLATIONS? |
| COLLATION_CHARACTER_SET_APPLICABILITY |
| ROUTINES|
| STATISTICS? |
| VIEWS |
| TRIGGERS|
| USER_PRIVILEGES|
| SCHEMA_PRIVILEGES? |
| TABLE_PRIVILEGES|
| COLUMN_PRIVILEGES? |
| TABLE_CONSTRAINTS? |
| KEY_COLUMN_USAGE|
+---------------------------------------+
SHOW COLUMNS和DESCRIBE能夠顯示單獨INFORMATION_SCHEMA表中的列信息。
擴展了一些SHOW語句,允許使用WHERE子句:
SHOW CHARACTER SET
SHOW COLLATION
SHOW COLUMNS
SHOW DATABASES
SHOW FUNCTION STATUS
SHOW KEYS
SHOW OPEN TABLES
SHOW PROCEDURE STATUS
SHOW STATUS
SHOW TABLE STATUS
SHOW TABLES
SHOW VARIABLES
如果有WHERE子句的話,將根據SHOW語句顯示的列名進行計算。例如,SHOW COLLATION語句可產生這些輸出列:
例如,SHOW CHARACTER SET語句可產生這些輸出列:
mysql> SHOW CHARACTER SET;
| Charset
| 描述
默認校對
| 最大長度
?big5
| ?Big5 Traditional Chinese
| ?big5_chinese_ci
| 2
|
|-----|-----|-----|-----|-----|-----|
| ?dec8
| ?DEC West European
| ?dec8_swedish_ci
| 1
|
| ?cp850
| ?DOS West European
| ?cp850_general_ci
| 1
|
| ?hp8
| ?HP West European
| ?hp8_english_ci
| 1
|
| ?koi8r
| ?KOI8-R Relcom Russian
| ?koi8r_general_ci
| 1
|
| ?latin1
| ?cp1252 West European?
| ?latin1_swedish_ci
| 1
|
| ?latin2
| ?ISO 8859-2 Central European
| ?latin2_general_ci
| 1
|
?
要想與SHOW CHARACTER SET一起使用WHERE子句,應引用這些列名稱。例如,在下面的語句中,給出了用于默認校對且含有字符串“japanese”的字符集的信息:
mysql> SHOW CHARACTER SET WHERE `Default collation` LIKE '%japanese%';
| ?Charset
| ?描述? | 默認校對
最大長度
|
|-----|-----|-----|
| ?ujis
| ?EUC-JP Japanese
| ?ujis_japanese_ci
| 3
|
| ?sjis
| ?Shift-JIS Japanese?
| ?sjis_japanese_ci
| 2
|
| ?cp932
| ?SJIS for Windows Japanese
| ?cp932_japanese_ci
| 2
|
| ?eucjpms
| ?UJIS for Windows Japanese
| ?eucjpms_japanese_ci
| 3
|
該語句顯示了多字節字符集。
mysql> SHOW CHARACTER SET WHERE Maxlen > 1;
| ?Charset
| ?描述?
| 默認校對
最大長度
|
|-----|-----|-----|
| ?big5
| ?Big5 Traditional Chinese?
| ?big5_chinese_ci
| 2
|
| ?ujis
| ?EUC-JP Japanese
| ?ujis_japanese_ci
| 3
|
| ?sjis
| ?Shift-JIS Japanese?
| ?sjis_japanese_ci
| 2
|
| ?euckr
| ?EUC-KR Korean
| ?euckr_korean_ci
| 2
|
| ?gb2312?
| ?GB2312 Simplified Chinese
| ?gb2312_chinese_ci
| 2
|
| ?gbk
| ?GBK Simplified Chinese
| ?gbk_chinese_ci
| 2
|
| ?utf8
| ?UTF-8 Unicode
| ?utf8_general_ci
| 3
|
| ?ucs2
| ?UCS-2 Unicode
| ?ucs2_general_ci
| 2
|
| ?cp932
| ?SJIS for Windows Japanese
| ?cp932_japanese_ci
| 2
|
| ?eucjpms
| ?UJIS for Windows Japanese
| ?eucjpms_japanese_ci
| 3
|
?
這是MySQL參考手冊的翻譯版本,關于MySQL參考手冊,請訪問[dev.mysql.com](http://dev.mysql.com/doc/mysql/en)。原始參考手冊為英文版,與英文版參考手冊相比,本翻譯版可能不是最新的。
- 前言
- 1. 一般信息
- 2. 安裝MySQL
- 3. 教程
- 4. MySQL程序概述
- 5. 數據庫管理
- 6. MySQL中的復制
- 7. 優化
- 8. 客戶端和實用工具程序
- 9. 語言結構
- 10. 字符集支持
- 11. 列類型
- 12. 函數和操作符
- 13. SQL語句語法
- 14. 插件式存儲引擎體系結構
- 15. 存儲引擎和表類型
- 16. 編寫自定義存儲引擎
- 17. MySQL簇
- 18. 分區
- 19. MySQL中的空間擴展
- 20. 存儲程序和函數
- 21. 觸發程序
- 22. 視圖
- 23. INFORMATION_SCHEMA信息數據庫
- 24. 精度數學
- 25. API和庫
- 26. 連接器
- 27. 擴展MySQL
- A. 問題和常見錯誤
- B. 錯誤代碼和消息
- C. 感謝
- D. MySQL變更史
- E. 移植到其他系統
- F. 環境變量
- G. MySQL正則表達式
- H. MySQL中的限制
- I. 特性限制
- J. GNU通用公共許可
- K. MySQL FLOSS許可例外
- 索引