Metadata SQL
SQL kan een krachtige taal zijn. Metadata SQL is een handige SQL feature die onbekend is bij veel programmeurs. Metadata (van Grieks "meta" en Latijns "data") is data dat informatie over data beschrijft. Waar is dat handig voor? Denk bijvoorbeeld aan O/RM of installatie scripts. In dit artikel zullen we vooral richten op het populaire MySQL en PostgreSQL, al moet het geen probleem zijn om dit te wijzigen voor andere RDMS. Voor MySQL en PostgreSQL zullen we vooral INFORMATION_SCHEMA behandelen.
Show me the data!
We zullen de standaard database 'mysql' gebruiken die elke MySQL database heeft. Laten we simpel beginnen. We willen alle tabellen weten in een database. Hoe doen we dat? INFORMATION_SCHEMA.TABLES zal ons helpen.
-
mysql> SELECT table_name FROM information_schema.tables
-
WHERE table_schema = 'mysql';
-
+---------------------------+
-
| table_name |
-
+---------------------------+
-
| columns_priv |
-
| db |
-
| func |
-
| help_category |
-
| help_keyword |
-
| help_relation |
-
| help_topic |
-
| host |
-
| proc |
-
| procs_priv |
-
| tables_priv |
-
| time_zone |
-
| time_zone_leap_second |
-
| time_zone_name |
-
| time_zone_transition |
-
| time_zone_transition_type |
-
| user |
-
+---------------------------+
-
17 rows in set (0.00 sec)
De volgende stap is de kolommen en haar datatype opvragen. Ook hiervoor gebruiken we INFORMATION_SCHEMA, zo doen we dat:
-
mysql> SELECT column_name, data_type FROM information_schema.columns
-
WHERE table_schema = 'mysql' AND table_name = 'func';
-
+-------------+-----------+
-
| column_name | data_type |
-
+-------------+-----------+
-
| name | char |
-
| ret | tinyint |
-
| dl | char |
-
| type | enum |
-
+-------------+-----------+
-
4 rows in set (0.00 sec)
MySQL-only
De vorige SQL queries werken voor MySQL en PosgreSQL, zij hebben allebei INFORMATION_SCHEMA dat eigenlijk views zijn van ISO SQL. MySQL kent ook SQL dat alleen werkt voor haarzelf. Dat is de SHOW syntax. Je kunt beter INFORMATION_SCHEMA gebruiken dan de SHOW syntax, omdat die ook op PostgreSQL werkt (volgens mij ook SQL server, maar dat weet ik niet zeker). We kunnen de vorige SQL queries herschrijven naar de SHOW syntax. Alle tabellen opvragen met met SHOW lijkt bijna op een SELECT statement.
-
mysql> SHOW tables FROM mysql;
-
+---------------------------+
-
| Tables_in_mysql |
-
+---------------------------+
-
| columns_priv |
-
| db |
-
| func |
-
| help_category |
-
| help_keyword |
-
| help_relation |
-
| help_topic |
-
| host |
-
| proc |
-
| procs_priv |
-
| tables_priv |
-
| time_zone |
-
| time_zone_leap_second |
-
| time_zone_name |
-
| time_zone_transition |
-
| time_zone_transition_type |
-
| user |
-
+---------------------------+
-
17 rows in set (0.00 sec)
Hetzelfde voor alle kolommen met datatypes, alleen kan je niet met de SHOW syntax alleen vragen naar de kolomnaam en datatype. Je krijgt alles terug, dus ook andere gegevens zoals 'default value' en 'keys'.
Je kunt nog veel meer informatie opvragen zoals foreign keys, alle kolommen met indexes of constraints. Zie de documentatie van je RDMS.
Volg Scriptorama via RSS!
Reageer ook!
Let op dat INFORMATION_SCHEMA pas vanaf MySQL 5.0 beschikbaar is voor MySQL, terwijl de SHOW-syntax (en deze is MySQL eigen) al veel langer beschikbaar is.
Om het geheel nog iets completer te maken: SQL Server biedt ook INFORMATION_SCHEMA maar biedt ook z'n informatie aan in de "System Tables" (syscolumns, sysindex, etc.)
Door Mathieu Kooiman
op 08.07.06 @ 10:34 am | Permalink
Line and paragraph breaks automatic, e-mail address never displayed, HTML allowed:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>