Kapitel 22. Die Datenbank `INFORMATION_SCHEMA`
Zurück |  | Weiter

## Kapitel 22. Die Datenbank `INFORMATION_SCHEMA`

`INFORMATION_SCHEMA` gibt Zugriff auf Datenbank-Metadaten.

Metadaten sind Informationen über Daten, also beispielsweise der Name einer Datenbank oder Tabelle, der Datentyp einer Spalte, oder Zugriffsberechtigungen. Manchmal werden diese Informationen auch als Data Dictionary oder Systemkatalog bezeichnet.

`INFORMATION_SCHEMA` ist die Informationsdatenbank, also der Ort, an dem Informationen über alle anderen auf dem betreffenden MySQL Server gepflegten Datenbanken gespeichert werden. Im `INFORMATION_SCHEMA` gibt es eine Reihe von schreibgeschützten Tabellen. Da diese in Wirklichkeit keine Basistabellen, sondern Views sind, werden Sie keine Dateien sehen, die mit ihnen verbunden sind.

Ein Beispiel:

    mysql> SELECT table_name, table_type, engine
        -> FROM information_schema.tables
        -> WHERE table_schema = 'db5'
        -> ORDER BY table_name DESC;
    +------------+------------+--------+
    | table_name | table_type | engine |
    +------------+------------+--------+
    | v56        | VIEW       | NULL   |
    | v3         | VIEW       | NULL   |
    | v2         | VIEW       | NULL   |
    | v          | VIEW       | NULL   |
    | tables     | BASE TABLE | MyISAM |
    | t7         | BASE TABLE | MyISAM |
    | t3         | BASE TABLE | MyISAM |
    | t2         | BASE TABLE | MyISAM |
    | t          | BASE TABLE | MyISAM |
    | pk         | BASE TABLE | InnoDB |
    | loop       | BASE TABLE | MyISAM |
    | kurs       | BASE TABLE | MyISAM |
    | k          | BASE TABLE | MyISAM |
    | into       | BASE TABLE | MyISAM |
    | goto       | BASE TABLE | MyISAM |
    | fk2        | BASE TABLE | InnoDB |
    | fk         | BASE TABLE | InnoDB |
    +------------+------------+--------+
    17 rows in set (0.01 sec)

Erklärung: Die Anweisung verlangt eine Liste aller Tabellen der Datenbank `db5` in umgekehrter alphabetischer Reihenfolge, wobei jeweils nur drei Informationen angezeigt werden sollen: der Name der Tabelle, ihr Typ und ihre Speicher-Engine.

Jeder MySQL-Benutzer hat das Recht, auf diese Tabellen zuzugreifen, allerdings nur auf diejenigen Tabellenzeilen, die sich auf Objekte beziehen, für welche er die richtigen Zugriffsberechtigungen hat.

Die Anweisung `SELECT ... FROM INFORMATION_SCHEMA` ist als ein konsistenteres Mittel gedacht, Zugriff auf die Informationen zu gewähren, welche die verschiedenen von MySQL unterstützten `SHOW`-Anweisungen geben (`SHOW DATABASES`, `SHOW TABLES` usw.). Die Verwendung von `SELECT` hat im Vergleich zu `SHOW` folgende Vorteile:

- Sie entspricht den Codd'schen Regeln: Jeglicher Zugriff geht auf Tabellen.

- Niemand muss eine neue Anweisungssyntax lernen. Da jeder bereits weiß, wie `SELECT` funktioniert, müssen lediglich die Objektnamen gelernt werden.

- Der Implementierer muss sich nicht um Schlüsselwörter Gedanken machen.

- Es sind Millionen Varianten für die Ausgabe möglich, nicht nur eine. So erhält man mehr Flexibilität für Anwendungen, die immer wieder andere Metadaten benötigen.

- Die Migration ist einfacher, da auch alle anderen DBMS so arbeiten.

Da jedoch `SHOW` bei den Angestellten und Nutzern von MySQL so beliebt ist und eine Abschaffung dieser Anweisung Verwirrung stiften könnte, genügen die Vorteile der konventionellen Syntax nicht als Grund, auf `SHOW` ganz zu verzichten. Stattdessen gibt es sogar Verbesserungen an `SHOW` in MySQL 5.1. Diese werden in Abschnitt 22.22, „Erweiterungen der `SHOW`-Anweisungen“, genauer beschrieben.

Es gibt keinen Unterschied zwischen den Berechtigungen, die für `SHOW`-Anweisungen erforderlich sind, und jenen, die zur Datenabfrage aus dem `INFORMATION_SCHEMA` benötigt werden. In beiden Fällen müssen Sie irgendeine Berechtigung für ein Objekt besitzen, um Informationen über es anzeigen zu lassen.

Die Implementierung der `INFORMATION_SCHEMA`-Tabellenstrukturen in MySQL entspricht dem ANSI/ISO SQL:2003-Standard Teil 11 Schemata. Unser Ziel ist es, möglichst weitgehend dem SQL:2003-Core-Feature F021 Basic information schema zu entsprechen.

Benutzer von SQL Server 2000 (auch dieses System befolgt den Standard) werden vielleicht starke Ähnlichkeiten bemerken. Allerdings hat MySQL viele Spalten weggelassen, die für unsere Implementierung keine Rolle spielen, und stattdessen andere, MySQL-spezifische Spalten hinzugefügt. Dazu gehört die Spalte `ENGINE` in der Tabelle `INFORMATION_SCHEMA.TABLES`.

Zwar verwenden die anderen DBMS unterschiedliche Namen, wie etwa `syscat` oder `system`, aber der Standardname lautet `INFORMATION_SCHEMA`.

Letztlich haben wir eine Datenbank namens `INFORMATION_SCHEMA` vor uns, auch wenn der Server kein Datenbankverzeichnis hierfür anlegt. Es ist möglich, `INFORMATION_SCHEMA` mit einer `USE`-Anweisung als Standarddatenbank einzustellen, allerdings können die Tabelleninhalte nur gelesen werden. Einfügungen, Änderungen oder Löschungen in den Tabellen sind ausgeschlossen.

Die folgenden Abschnitte beschreiben die Tabellen und Spalten von `INFORMATION_SCHEMA`. Zu jeder Spalte gibt es drei Informationen:

- Der „Standard Name“ gibt den SQL-Standardnamen der Spalte an.

- „`SHOW` name“ ist der entsprechende Feldname in der nächstgelegenen `SHOW`-Anweisung (sofern vorhanden).

- „Remarks“ sind eventuelle Zusatzinformationen. Wenn dieses Feld den Wert `NULL` hat, bedeutet dies, dass der Wert der Spalte immer `NULL` lautet.

Um keine Namen zu verwenden, die im Standard oder in DB2, SQL Server oder Oracle reserviert sind, haben wir die Namen der als „MySQL extension“ markierten Spalten geändert. (So wurde beispielsweise in der Tabelle `TABLES` aus `COLLATION` eine `TABLE_COLLATION`.) Siehe auch die Liste der reservierten Wörter am Ende dieses Artikels: http://www.dbazine.com/gulutzan5.shtml.

Die Definition für Zeichenspalten (beispielsweise `TABLES.TABLE_NAME`) ist im Allgemeinen `VARCHAR(`N`) CHARACTER SET utf8`, wobei `N` mindestens 64 ist.

Jeder Abschnitt gibt an, welche `SHOW`-Anweisung einer `SELECT`-Anweisung entspricht, die Informationen aus dem `INFORMATION_SCHEMA` abfragt, sofern eine solche Anweisung existiert.

Hinweis: Zurzeit fehlen noch einige Spalten und andere stehen in der verkehrten Reihenfolge. Wir arbeiten daran und werden die Dokumentation bei Änderungen aktualisieren.

## 22.1. Die Tabelle `INFORMATION_SCHEMA SCHEMATA`

Da ein Schema eine Datenbank ist, liefert die Tabelle `SCHEMATA` Informationen über Datenbanken.

Standard Name | `SHOW` name | Remarks
`CATALOG_NAME` | - | `NULL`
`SCHEMA_NAME` |  | Database
`DEFAULT_CHARACTER_SET_NAME` |  |
`DEFAULT_COLLATION_NAME` |  |
`SQL_PATH` |  | `NULL`

Die folgenden Anweisungen sind äquivalent:

    SELECT SCHEMA_NAME AS `Database`
      FROM INFORMATION_SCHEMA.SCHEMATA
      [WHERE SCHEMA_NAME LIKE 'wild']

    SHOW DATABASES
      [LIKE 'wild']

## 22.2. Die Tabelle `INFORMATION_SCHEMA TABLES`

Die Tabelle `TABLES` informiert über die Tabellen in der Datenbank.

Standard Name | `SHOW` name | Remarks
`TABLE_CATALOG` |  | `NULL`
`TABLE_SCHEMA` | `Table_`... |
`TABLE_NAME` | `Table_`... |
`TABLE_TYPE` |  |
`ENGINE` | `Engine` | MySQL extension
`VERSION` | `Version` | MySQL extension
`ROW_FORMAT` | `Row_format` | MySQL extension
`TABLE_ROWS` | `Rows` | MySQL extension
`AVG_ROW_LENGTH` | `Avg_row_length` | MySQL extension
`DATA_LENGTH` | `Data_length` | MySQL extension
`MAX_DATA_LENGTH` | `Max_data_length` | MySQL extension
`INDEX_LENGTH` | `Index_length` | MySQL extension
`DATA_FREE` | `Data_free` | MySQL extension
`AUTO_INCREMENT` | `Auto_increment` | MySQL extension
`CREATE_TIME` | `Create_time` | MySQL extension
`UPDATE_TIME` | `Update_time` | MySQL extension
`CHECK_TIME` | `Check_time` | MySQL extension
`TABLE_COLLATION` | `Collation` | MySQL extension
`CHECKSUM` | `Checksum` | MySQL extension
`CREATE_OPTIONS` | `Create_options` | MySQL extension
`TABLE_COMMENT` | `Comment` | MySQL extension

Hinweise:

- `TABLE_SCHEMA` und `TABLE_NAME` sind in einer `SHOW`-Anzeige ein einziges Feld, beispielsweise `Table_in_db1`.

- Der `TABLE_TYPE` sollte `BASE TABLE` oder `VIEW` sein. Wenn die Tabelle eine temporäre ist, ist `TABLE_TYPE` = `TEMPORARY`. (Da es keine temporären Views gibt, ist dies eindeutig.)

- Die Spalte `TABLE_ROWS` ist `NULL`, wenn die Tabelle in der `INFORMATION_SCHEMA`-Datenbank vorliegt. Bei `InnoDB`-Tabellen ist die Zeilenzahl nur eine ungefähre Schätzung, die für die SQL-Optimierung benötigt wird.

- Es ist kein Standardzeichensatz der Tabelle vorgegeben, doch `TABLE_COLLATION` kommt einem Standardzeichensatz nahe, da die Namen von Kollationen mit dem Namen eines Zeichensatzes anfangen.

Die folgenden Anweisungen sind äquivalent:

    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']

## 22.3. Die Tabelle `INFORMATION_SCHEMA COLUMNS`

Die Tabelle `COLUMNS` informiert über die Spalten der Tabellen.

Standard Name | `SHOW` name | Remarks
`TABLE_CATALOG` |  | `NULL`
`TABLE_SCHEMA` |  |
`TABLE_NAME` |  |
`COLUMN_NAME` | `Field` |
`ORDINAL_POSITION` |  | see notes
`COLUMN_DEFAULT` | `Default` |
`IS_NULLABLE` | `Null` |
`DATA_TYPE` | `Type` |
`CHARACTER_MAXIMUM_LENGTH` | `Type` |
`CHARACTER_OCTET_LENGTH` |  |
`NUMERIC_PRECISION` | `Type` |
`NUMERIC_SCALE` | `Type` |
`CHARACTER_SET_NAME` |  |
`COLLATION_NAME` | `Collation` |
`COLUMN_TYPE` | `Type` | MySQL extension
`COLUMN_KEY` | `Key` | MySQL extension
`EXTRA` | `Extra` | MySQL extension
`COLUMN_COMMENT` | `Comment` | MySQL extension

Hinweise:

- In der `SHOW`-Anweisung werden unter `Type` Werte von mehreren verschiedenen `COLUMNS`-Spalten wiedergegeben.

- `ORDINAL_POSITION` is notwendig, da Sie vielleicht eines Tages `ORDER BY ORDINAL_POSITION` verwenden werden. Im Gegensatz zu `SHOW` verwendet ein `SELECT` keine automatische Reihenfolge.

- `CHARACTER_OCTET_LENGTH` sollte gleich `CHARACTER_MAXIMUM_LENGTH` sein, außer bei Multibytezeichensätzen.

- `CHARACTER_SET_NAME` kann von `Collation` abgeleitet werden. Wenn Sie beispielsweise `SHOW FULL COLUMNS FROM t` verlangen und in der `Collation`-Spalte den Wert `latin1_swedish_ci` entdecken, ist der Zeichensatz das, was vor dem ersten Unterstrich steht: `latin1`.

Die folgenden Anweisungen sind nahezu äquivalent:

    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']

## 22.4. Die Tabelle `INFORMATION_SCHEMA STATISTICS`

Die `STATISTICS`-Tabelle liefert Ihnen Informationen über Tabellenindizes.

Standard Name | `SHOW` name | Remarks
`TABLE_CATALOG` |  | `NULL`
`TABLE_SCHEMA` |  | = Database
`TABLE_NAME` | `Table` |
`NON_UNIQUE` | `Non_unique` |
`INDEX_SCHEMA` |  | = Database
`INDEX_NAME` | `Key_name` |
`SEQ_IN_INDEX` | `Seq_in_index` |
`COLUMN_NAME` | `Column_name` |
`COLLATION` | `Collation` |
`CARDINALITY` | `Cardinality` |
`SUB_PART` | `Sub_part` | MySQL extension
`PACKED` | `Packed` | MySQL extension
`NULLABLE` | `Null` | MySQL extension
`INDEX_TYPE` | `Index_type` | MySQL extension
`COMMENT` | `Comment` | MySQL extension

Hinweise:

- Eine Standardtabelle für Indizes gibt es nicht. Die obige Liste entspricht dem, was SQL Server 2000 als `sp_statistics` zurückliefert, nur dass wir den Namen `QUALIFIER` durch `CATALOG` und `OWNER` durch `SCHEMA` ersetzt haben.

  Es ist offensichtlich, dass die obige Tabelle und die Ausgabe von `SHOW INDEX` dieselbe Abstammung haben. Daher besteht bereits eine enge Korrelation.

Die folgenden Anweisungen sind äquivalent:

    SELECT * FROM INFORMATION_SCHEMA.STATISTICS
      WHERE table_name = 'tbl_name'
      [AND table_schema = 'db_name']

    SHOW INDEX
      FROM tbl_name
      [FROM db_name]

## 22.5. Die Tabelle `INFORMATION_SCHEMA USER_PRIVILEGES`

Die Tabelle `USER_PRIVILEGES` informiert über globale Berechtigungen. Diese Information stammt aus der Berechtigungstabelle `mysql.user`.

Standard Name | `SHOW` name | Remarks
`GRANTEE` |  | `'`user_name`'@'`host_name`'` value
`TABLE_CATALOG` |  | `NULL`
`PRIVILEGE_TYPE` |  |
`IS_GRANTABLE` |  |

Hinweis:

- Dies ist keine Standardtabelle. Sie entnimmt ihre Werte der Tabelle `mysql.user`.

## 22.6. Die Tabelle `INFORMATION_SCHEMA SCHEMA_PRIVILEGES`

Die Tabelle `SCHEMA_PRIVILEGES` liefert Informationen über Schema-(Datenbank-)Berechtigungen. Diese Informationen stammen aus der Berechtigungstabelle `mysql.db`.

Standard Name | `SHOW` name | Remarks
`GRANTEE` |  | `'`user_name`'@'`host_name`'` value
`TABLE_CATALOG` |  | `NULL`
`TABLE_SCHEMA` |  |
`PRIVILEGE_TYPE` |  |
`IS_GRANTABLE` |  |

Hinweis:

- Dies ist ebenfalls keine Standardtabelle. Ihre Werte erhält sie aus der Tabelle `mysql.db`.

## 22.7. Die Tabelle `INFORMATION_SCHEMA TABLE_PRIVILEGES`

Die Tabelle `TABLE_PRIVILEGES` liefert Informationen über Tabellenberechtigungen. Diese Informationen stammen aus der Berechtigungstabelle `mysql.tables_priv`.

Standard Name | `SHOW` name | Remarks
`GRANTEE` |  | `'`user_name`'@'`host_name`'` value
`TABLE_CATALOG` |  | `NULL`
`TABLE_SCHEMA` |  |
`TABLE_NAME` |  |
`PRIVILEGE_TYPE` |  |
`IS_GRANTABLE` |  |

Die folgenden Anweisungen sind nicht äquivalent:

    SELECT ... FROM INFORMATION_SCHEMA.TABLE_PRIVILEGES

    SHOW GRANTS ...

Der `PRIVILEGE_TYPE` kann einen (und nur einen) der folgenden Werte annehmen: `SELECT`, `INSERT`, `UPDATE`, `REFERENCES`, `ALTER`, `INDEX`, `DROP`, `CREATE VIEW`.

## 22.8. Die Tabelle `INFORMATION_SCHEMA COLUMN_PRIVILEGES`

Die `COLUMN_PRIVILEGES`-Tabelle liefert Informationen über Spaltenberechtigungen. Diese Informationen entstammen der Berechtigungstabelle `mysql.columns_priv`.

Standard Name | `SHOW` name | Remarks
`GRANTEE` |  | `'`user_name`'@'`host_name`'` value
`TABLE_CATALOG` |  | `NULL`
`TABLE_SCHEMA` |  |
`TABLE_NAME` |  |
`COLUMN_NAME` |  |
`PRIVILEGE_TYPE` |  |
`IS_GRANTABLE` |  |

Hinweise:

- `SHOW FULL COLUMNS` gibt alle Berechtigungen in einem einzigen Feld und kleingeschrieben aus, beispielsweise als `select,insert,update,references`. In `COLUMN_PRIVILEGES` steht nur eine einzige großgeschriebene Berechtigung pro Zeile.

- `PRIVILEGE_TYPE` kann einen (und nur einen) der folgenden Werte haben: `SELECT`, `INSERT`, `UPDATE`, `REFERENCES`.

- Wenn der Benutzer das `GRANT OPTION`-Recht hat, sollte `IS_GRANTABLE` den Wert `YES` haben, andernfalls `NO`. In der Ausgabe ist `GRANT OPTION` nicht als separate Berechtigung aufgeführt.

Die folgenden Anweisungen sind nicht äquivalent:

    SELECT ... FROM INFORMATION_SCHEMA.COLUMN_PRIVILEGES

    SHOW GRANTS ...

## 22.9. Die Tabelle `INFORMATION_SCHEMA CHARACTER_SETS`

Die `CHARACTER_SETS`-Tabelle gibt Informationen über die verfügbaren Zeichensätze.

Standard Name | `SHOW` name | Remarks
`CHARACTER_SET_NAME` | `Charset` |
`DEFAULT_COLLATE_NAME` | `Default collation` |
`DESCRIPION` | `Description` | MySQL extension
`MAXLEN` | `Maxlen` | MySQL extension

Hinweis:

- Wir haben der Ausgabe von `SHOW CHARACTER SET` zwei Spalten hinzugefügt, die nicht zum Standard gehören, nämlich `Description` und `Maxlen`.

Die folgenden Anweisungen sind äquivalent:

    SELECT * FROM INFORMATION_SCHEMA.CHARACTER_SETS
      [WHERE name LIKE 'wild']

    SHOW CHARACTER SET
      [LIKE 'wild']

## 22.10. Die Tabelle `INFORMATION_SCHEMA COLLATIONS`

Die `COLLATIONS`-Tabelle informiert über die Kollationen der jeweiligen Zeichensätze.

Standard Name | `SHOW` name | Remarks
`COLLATION_NAME` | `Collation` |

Hinweis:

- Wir haben in der Ausgabe von `SHOW COLLATION` fünf nicht zum Standard gehörende Spalten hinzugefügt, nämlich `Charset`, `Id`, `Default`, `Compiled` und `Sortlen`.

Die folgenden Anweisungen sind äquivalent:

    SELECT COLLATION_NAME FROM INFORMATION_SCHEMA.COLLATIONS
      [WHERE collation_name LIKE 'wild']

    SHOW COLLATION
      [LIKE 'wild']

## 22.11. Die Tabelle `INFORMATION_SCHEMA COLLATION_CHARACTER_SET_APPLICABILITY`

Die `COLLATION_CHARACTER_SET_APPLICABILITY`-Tabelle zeigt an, welcher Zeichensatz für welche Kollation gilt. Die Spalten sind äquivalent zu den ersten beiden Feldern, die `SHOW COLLATION` anzeigt.

Standard Name | `SHOW` name | Remarks
`COLLATION_NAME` | `Collation` |
`CHARACTER_SET_NAME` | `Charset` |

## 22.12. Die Tabelle `INFORMATION_SCHEMA TABLE_CONSTRAINTS`

Die `TABLE_CONSTRAINTS`-Tabelle zeigt an, welche Tabellen Constraints unterliegen.

Standard Name | `SHOW` name | Remarks
`CONSTRAINT_CATALOG` |  | `NULL`
`CONSTRAINT_SCHEMA` |  |
`CONSTRAINT_NAME` |  |
`TABLE_SCHEMA` |  |
`TABLE_NAME` |  |
`CONSTRAINT_TYPE` |  |

Hinweise:

- Der Wert von `CONSTRAINT_TYPE` kann `UNIQUE`, `PRIMARY KEY` oder `FOREIGN KEY` sein.

- Die Informationen über `UNIQUE` und `PRIMARY KEY` gleichen ungefähr dem, was `SHOW INDEX` im Feld `Key_name` ausgibt, wenn das Feld `Non_unique` den Wert `0` hat.

- Die Spalte `CONSTRAINT_TYPE` kann einen der folgenden Werte enthalten: `UNIQUE`, `PRIMARY KEY`, `FOREIGN KEY`, `CHECK`. Sie ist eine `CHAR`-Spalte (keine `ENUM`-Spalte). Der `CHECK`-Wert wird erst zur Verfügung stehen, wenn wir `CHECK` unterstützen.

## 22.13. Die Tabelle `INFORMATION_SCHEMA KEY_COLUMN_USAGE`

Die `KEY_COLUMN_USAGE`-Tabelle beschreibt, welche Schlüsselspalten Constraints haben.

Standard Name | `SHOW` name | Remarks
`CONSTRAINT_CATALOG` |  | `NULL`
`CONSTRAINT_SCHEMA` |  |
`CONSTRAINT_NAME` |  |
`TABLE_CATALOG` |  |
`TABLE_SCHEMA` |  |
`TABLE_NAME` |  |
`COLUMN_NAME` |  |
`ORDINAL_POSITION` |  |
`POSITION_IN_UNIQUE_CONSTRAINT` |  |
`REFERENCED_TABLE_SCHEMA` |  |
`REFERENCED_TABLE_NAME` |  |
`REFERENCED_COLUMN_NAME` |  |

Hinweise:

- Ist der Constraint ein Fremdschlüssel, so ist dies die Spalte des Fremdschlüssels und nicht die Spalte, auf die er verweist.

- Der Wert von `ORDINAL_POSITION` gibt die Position der Spalte im Constraint und nicht in der Tabelle wieder. Die Spaltenpositionen werden beginnend mit 1 durchnummeriert.

- Der Wert von `POSITION_IN_UNIQUE_CONSTRAINT` ist `NULL` für Unique- und Fremdschlüssel-Constraints. Bei Fremdschlüssel-Constraints ist es die Ordinalposition im Schlüssel der referenzierten Tabelle.

  Nehmen wir beispielsweise an, wir hätten zwei Tabellen namens `t1` und `t3`, die wie folgt definiert sind:

      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;

  Für diese beiden Tabellen hat die Tabelle `KEY_COLUMN_USAGE` zwei Zeilen:

  - eine Zeile mit `CONSTRAINT_NAME` = `'PRIMARY'`, `TABLE_NAME` = `'t1'`, `COLUMN_NAME` = `'s3'`, `ORDINAL_POSITION` = `1`, `POSITION_IN_UNIQUE_CONSTRAINT` = `NULL`

  - eine Zeile mit `CONSTRAINT_NAME` = `'CO'`, `TABLE_NAME` = `'t3'`, `COLUMN_NAME` = `'s2'`, `ORDINAL_POSITION` = `1`, `POSITION_IN_UNIQUE_CONSTRAINT` = `1`

## 22.14. Die Tabelle `INFORMATION_SCHEMA ROUTINES`

Die `ROUTINES`-Tabelle informiert über gespeicherte Routinen (sowohl Prozeduren als auch Funktionen). Die `ROUTINES`-Tabelle enthält zurzeit keine benutzerdefinierten Funktionen (UDFs).

Die Spalte „`mysql.proc` name“ gibt die `mysql.proc`-Tabellenspalte an, die der `INFORMATION_SCHEMA.ROUTINES`-Tabellenspalte entspricht (sofern vorhanden).

Standard Name | `mysql.proc` name | Remarks
`SPECIFIC_NAME` | `specific_name` |
`ROUTINE_CATALOG` |  | `NULL`
`ROUTINE_SCHEMA` | `db` |
`ROUTINE_NAME` | `name` |
`ROUTINE_TYPE` | `type` | `{PROCEDURE|FUNCTION}`
`DTD_IDENTIFIER` |  | (data type descriptor)
`ROUTINE_BODY` |  | `SQL`
`ROUTINE_DEFINITION` | `body` |
`EXTERNAL_NAME` |  | `NULL`
`EXTERNAL_LANGUAGE` | `language` | `NULL`
`PARAMETER_STYLE` |  | `SQL`
`IS_DETERMINISTIC` | `is_deterministic` |
`SQL_DATA_ACCESS` | `sql_data_access` |
`SQL_PATH` |  | `NULL`
`SECURITY_TYPE` | `security_type` |
`CREATED` | `created` |
`LAST_ALTERED` | `modified` |
`SQL_MODE` | `sql_mode` | MySQL extension
`ROUTINE_COMMENT` | `comment` | MySQL extension
`DEFINER` | `definer` | MySQL extension

Hinweise:

- MySQL berechnet die `EXTERNAL_LANGUAGE` wie folgt:

  - Wenn `mysql.proc.language='SQL'`, so hat `EXTERNAL_LANGUAGE` den Wert `NULL`.

  - Ansonsten ist `EXTERNAL_LANGUAGE` das, was in `mysql.proc.language` aufgeführt ist. Da wir jedoch noch keine externen Sprachen eingerichtet haben, ist dies immer `NULL`.

## 22.15. Die Tabelle `INFORMATION_SCHEMA VIEWS`

Die `VIEWS`-Tabelle informiert über Views in Datenbanken. Für den Zugriff auf diese Tabelle ist die `SHOW VIEW`-Berechtigung nötig.

Standard Name | `SHOW` name | Remarks
`TABLE_CATALOG` |  | `NULL`
`TABLE_SCHEMA` |  |
`TABLE_NAME` |  |
`VIEW_DEFINITION` |  |
`CHECK_OPTION` |  |
`IS_UPDATABLE` |  |
`DEFINER` |  |
`SECURITY_TYPE` |  |

Hinweise:

- Die Spalte `VIEW_DEFINITION` enthält im Wesentlichen das, was auch `SHOW CREATE VIEW` im Feld `Create Table` anzeigt. Übergehen Sie die Wörter vor dem `SELECT` und hinter `WITH CHECK OPTION`. Angenommen, die Anweisung lautete ursprünglich:

      CREATE VIEW v AS
        SELECT s2,s1 FROM t
        WHERE s1 > 5
        ORDER BY s1
        WITH CHECK OPTION;

  Dann sieht die View-Definition folgendermaßen aus:

      SELECT s2,s1 FROM t WHERE s1 > 5 ORDER BY s1

- Die Spalte `CHECK_OPTION` hat immer den Wert `NONE`.

- Die Spalte `IS_UPDATABLE` ist bei veränderbaren Views `YES` und bei unveränderbaren `NO`.

- Die Spalte `DEFINER` gibt an, wer die View angelegt hat. `SECURITY_TYPE` hat den Wert `DEFINER` oder `INVOKER`.

## 22.16. Die Tabelle `INFORMATION_SCHEMA TRIGGERS`

Die `TRIGGERS`-Tabelle informiert über Trigger. Zugriff bekommt nur, wer die `SUPER`-Berechtigung vorweisen kann.

Standard Name | `SHOW` name | Remarks
`TRIGGER_CATALOG` |  | `NULL`
`TRIGGER_SCHEMA` |  |
`TRIGGER_NAME` | `Trigger` |
`EVENT_MANIPULATION` | `Event` |
`EVENT_OBJECT_CATALOG` |  | `NULL`
`EVENT_OBJECT_SCHEMA` |  |
`EVENT_OBJECT_TABLE` | `Table` |
`ACTION_ORDER` |  | `0`
`ACTION_CONDITION` |  | `NULL`
`ACTION_STATEMENT` | `Statement` |
`ACTION_ORIENTATION` |  | `ROW`
`ACTION_TIMING` | `Timing` |
`ACTION_REFERENCE_OLD_TABLE` |  | `NULL`
`ACTION_REFERENCE_NEW_TABLE` |  | `NULL`
`ACTION_REFERENCE_OLD_ROW` |  | `OLD`
`ACTION_REFERENCE_NEW_ROW` |  | `NEW`
`CREATED` |  | `NULL` (`0`)
`SQL_MODE` |  |
`DEFINER` |  |

Hinweise:

- Die Spalten `TRIGGER_SCHEMA` und `TRIGGER_NAME` zeigen den Namen der Datenbank an, in welcher der Trigger auftritt, und den Namen des Triggers.

- Die Spalte `EVENT_MANIPULATION` hat entweder den Wert `'INSERT'`, `'DELETE'` oder `'UPDATE'`.

- Wie in Kapitel 20, Trigger, bereits gesagt, ist jeder Trigger mit genau einer Tabelle verbunden. Die Spalte `EVENT_OBJECT_SCHEMA` zeigt die Datenbank an, zu der die Tabelle gehört, und `EVENT_OBJECT_TABLE` enthält den Namen der Tabelle.

- Die Anweisung `ACTION_ORDER` zeigt an, an welcher Ordinalposition die Aktion des Triggers in der Liste aller ähnlichen Trigger auf derselben Tabelle steht. Dieser Wert ist gegenwärtig immer `0`, da auf einer Tabelle nicht mehr als ein Trigger mit derselben `EVENT_MANIPULATION` und demselben `ACTION_TIMING` zulässig ist.

- Die Spalte `ACTION_STATEMENT` enthält die Anweisung, die bei Aufruf des Triggers ausgeführt wird. Dies ist dasselbe wie der Text in der `Statement`-Spalte der Ausgabe von `SHOW TRIGGERS`. Beachten Sie, dass dieser Text UTF-8-kodiert ist.

- Die Spalte `ACTION_ORIENTATION` enthält immer den Wert `'ROW'`.

- Die Spalte `ACTION_TIMING` enthält entweder den Wert `'BEFORE'` oder `'AFTER'`.

- Die Spalten `ACTION_REFERENCE_OLD_ROW` und `ACTION_REFERENCE_NEW_ROW` enthalten den alten und den neuen Spaltenbezeichner. Dies bedeutet, dass `ACTION_REFERENCE_OLD_ROW` immer den Wert `'OLD'` und `ACTION_REFERENCE_NEW_ROW` immer den Wert `'NEW'` hat.

- Die Spalte `SQL_MODE` zeigt, welcher SQL-Servermodus bei der Erstellung des Triggers in Kraft war (und somit auch für jeden Aufruf dieses Triggers in Kraft bleibt, egal welcher SQL-Servermodus gerade eingestellt sein mag). Diese Spalte hat denselben Wertebereich wie die Systemvariable `sql_mode`. Siehe auch Abschnitt 5.2.5, „Der SQL-Modus des Servers“.

- Die Spalte `DEFINER` kam in MySQL 5.1.2 neu hinzu. Der `DEFINER` ist der, der den Trigger definiert hat.

- Die folgenden Spalten haben immer den Wert `NULL`: `TRIGGER_CATALOG`, `EVENT_OBJECT_CATALOG`, `ACTION_CONDITION`, `ACTION_REFERENCE_OLD_TABLE`, `ACTION_REFERENCE_NEW_TABLE` und `CREATED`.

Ein Beispiel mit dem in Abschnitt 20.3, „Verwendung von Triggern“, definierten Trigger `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
                      SQL_MODE:
                       DEFINER: me@localhost

Siehe auch Abschnitt 13.5.4.23, „`SHOW TRIGGERS`“.

## 22.17. Die Tabelle `INFORMATION_SCHEMA PLUGINS`

Die `PLUGINS`-Tabelle informiert über Server-Plug-Ins.

Name | `SHOW` name | Remarks
`PLUGIN_NAME` |  |
`PLUGIN_VERSION` |  |
`PLUGIN_STATUS` |  |
`PLUGIN_TYPE` |  |
`PLUGIN_TYPE_VERSION` |  |
`PLUGIN_LIBRARY` |  |
`PLUGIN_LIBRARY_VERSION` |  |
`PLUGIN_AUTHOR` |  |
`PLUGIN_DESCRIPTION` |  |

Hinweis:

- Die `PLUGINS`-Tabelle gibt es seit MySQL 5.1.5.

## 22.18. Die Tabelle `INFORMATION_SCHEMA ENGINES`

Die `ENGINES`-Tabelle informiert über Speicher-Engines.

Name | `SHOW` name | Remarks
`ENGINE` | `Engine` |
`SUPPORT` | `Support` |
`COMMENT` | `Comment` |
`TRANSACTIONS` | `Transactions` |
`XA` | `XA` |
`SAVEPOINTS` | `Savepoints` |

Hinweis:

- Die `ENGINES`-Tabelle gibt es seit MySQL 5.1.5.

Siehe auch Abschnitt 13.5.4.9, „`SHOW ENGINES`“.

## 22.19. Die Tabelle `INFORMATION_SCHEMA PARTITIONS`

Die `PARTITIONS`-Tabelle informiert über Tabellenpartitionen.

Name | `SHOW` name | Remarks
`TABLE_CATALOG` |  |
`TABLE_SCHEMA` |  |
`TABLE_NAME` |  |
`PARTITION_NAME` |  |
`SUBPARTITION_NAME` |  |
`PARTITION_ORDINAL_POSITION` |  |
`SUBPARTITION_ORDINAL_POSITION` |  |
`PARTITION_METHOD` |  |
`SUBPARTITION_METHOD` |  |
`PARTITION_EXPRESSION` |  |
`SUBPARTITION_EXPRESSION` |  |
`PARTITION_DESCRIPTION` |  |
`TABLE_ROWS` |  |
`AVG_ROW_LENGTH` |  |
`DATA_LENGTH` |  |
`MAX_DATA_LENGTH` |  |
`INDEX_LENGTH` |  |
`DATA_FREE` |  |
`CREATE_TIME` |  |
`UPDATE_TIME` |  |
`CHECK_TIME` |  |
`CHECKSUM` |  |
`PARTITION_COMMENT` |  |
`NODEGROUP` |  |
`TABLESPACE_NAME` |  |

Hinweise:

- Die `PARTITIONS`-Tabelle gibt es seit MySQL 5.1.6.

- Wichtig: Wenn nach einem Upgrade auf MySQL 5.1.6 oder höher noch irgendwelche partitionierten Tabellen vorhanden sind, die in einer älteren MySQL-Version als MySQL 5.1.6 angelegt wurden, so ist auf der `PARTITIONS`-Tabelle kein `SELECT`, `SHOW` oder `DESCRIBE` möglich. Bitte lesen Sie Abschnitt D.1.1, „Änderungen in Release 5.1.6 (Noch nicht veröffentlicht)“ , bevor Sie von MySQL 5.1.5 oder einer älteren Version auf MySQL 5.1.6 oder höher aufrüsten.

## 22.20. Die Tabelle `INFORMATION_SCHEMA EVENTS`

Die `EVENTS`-Tabelle informiert über Ereignisplaner-Ereignisse.

Name | `SHOW` name | Remarks
`EVENT_CATALOG` |  |
`EVENT_SCHEMA` |  |
`EVENT_NAME` |  |
`DEFINER` |  |
`EVENT_BODY` |  |
`EVENT_TYPE` |  |
`EXECUTE_AT` |  |
`INTERVAL_VALUE` |  |
`INTERVAL_FIELD` |  |
`SQL_MODE` |  |
`STARTS` |  |
`ENDS` |  |
`STATUS` |  |
`ON_COMPLETION` |  |
`CREATED` |  |
`LAST_ALTERED` |  |
`LAST_EXECUTED` |  |
`EVENT_COMMENT` |  |

Hinweis:

- Die `EVENTS`-Tabelle gibt es seit MySQL 5.1.6.

## 22.21. Weitere `INFORMATION_SCHEMA`-Tabellen

Wir haben vor, noch weitere `INFORMATION_SCHEMA`-Tabellen zu implementieren. Insbesondere sehen wir die Notwendigkeit einer `PARAMETERS`- und einer `REFERENTIAL_CONSTRAINTS`-Tabelle.

## 22.22. Erweiterungen der `SHOW`-Anweisungen

Einige Erweiterungen von `SHOW`-Anweisungen gehören zur Implementierung des `INFORMATION_SCHEMA`:

- `SHOW` kann Informationen über die Struktur des `INFORMATION_SCHEMA` selbst liefern.

- Einige `SHOW`-Anweisungen können eine `WHERE`-Klausel haben. Dadurch können Sie flexibler angeben, welche Zeilen angezeigt werden sollen.

Da `INFORMATION_SCHEMA` eine Informationsdatenbank ist, wird ihr Name von der `SHOW DATABASES`-Anweisung ebenfalls ausgegeben. Ebenso können Sie auch `SHOW TABLES` auf dem `INFORMATION_SCHEMA` verwenden, um eine Liste seiner Tabellen zu erhalten:

    mysql> SHOW TABLES FROM INFORMATION_SCHEMA;
    +---------------------------------------+
    | Tables_in_information_schema          |
    +---------------------------------------+
    | CHARACTER_SETS                        |
    | COLLATIONS                            |
    | COLLATION_CHARACTER_SET_APPLICABILITY |
    | COLUMNS                               |
    | COLUMN_PRIVILEGES                     |
    | ENGINES                               |
    | EVENTS                                |
    | KEY_COLUMN_USAGE                      |
    | PARTITIONS                            |
    | PLUGINS                               |
    | ROUTINES                              |
    | SCHEMATA                              |
    | SCHEMA_PRIVILEGES                     |
    | STATISTICS                            |
    | TABLES                                |
    | TABLE_CONSTRAINTS                     |
    | TABLE_PRIVILEGES                      |
    | TRIGGERS                              |
    | USER_PRIVILEGES                       |
    | VIEWS                                 |
    +---------------------------------------+
    19 rows in set (0.03 sec)

`SHOW COLUMNS` und `DESCRIBE` können Informationen über die Spalten der einzelnen `INFORMATION_SCHEMA`-Tabellen liefern.

Mehrere `SHOW`-Anweisungen wurden um eine `WHERE`-Klausel erweitert:

    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

Wenn eine `WHERE`-Klausel vorhanden ist, wird sie mit den von `SHOW` ausgewiesenen Spaltennamen verglichen. So liefert beispielsweise die Anweisung `SHOW CHARACTER SET` folgende Ausgabespalten:

    mysql> SHOW CHARACTER SET;
    +----------+-----------------------------+---------------------+--------+
    | Charset  | Description                 | Default collation   | Maxlen |
    +----------+-----------------------------+---------------------+--------+
    | 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 |
    ...

Wenn Sie eine `WHERE`-Klausel mit `SHOW CHARACTER SET` verbinden würden, würden Sie auf diese Spaltennamen Bezug nehmen. Die folgende Anweisung zeigt beispielsweise Informationen über Zeichensätze an, deren Standardkollation den String `'japanese'` enthält:

    mysql> SHOW CHARACTER SET WHERE `Default collation` LIKE '%japanese%';
    +---------+---------------------------+---------------------+--------+
    | Charset | Description               | Default collation   | Maxlen |
    +---------+---------------------------+---------------------+--------+
    | 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 |
    +---------+---------------------------+---------------------+--------+

Die folgende Anweisung zeigt die Multibytezeichensätze an:

    mysql> SHOW CHARACTER SET WHERE Maxlen > 1;
    +---------+---------------------------+---------------------+--------+
    | Charset | Description               | Default collation   | Maxlen |
    +---------+---------------------------+---------------------+--------+
    | 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 |
    +---------+---------------------------+---------------------+--------+

Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.

Zurück |  | Weiter
Kapitel 21. Views | Zum Anfang | Kapitel 23. Präzisionsberechnungen