Here is a helpful function for making sense of
- foreign keys: which columns of this table refer to primary key of another
table
- referential: which tables columns refer to the primary key of this table
Presumes you are running MySQL with innodb tables. Tested with MySQL
4.1.1-alpha.
function relations ()
{
$statement = "SHOW TABLE STATUS ";
$res = mysql_query ($statement) or croak (mysql_error());
$meta = array();
while ($row = mysql_fetch_array($res)) {
$bits = array_map ('trim', explode (';', $row['Comment']));
$name = $row['Name'];
foreach ($bits as $bit)
{
if (!preg_match ('/\((.*)\) REFER (.*)/', $bit, $ab)) continue;
$fk = array();
$fk ['columns'] = preg_split ('/\(|\)|,/', $ab[1]);
$refers = array();
preg_match ('/(.+)\/(.+)\((.+)\)/', $ab[2], $x);
$y = preg_split ('/,/', $x[3]);
$refers['database'] = $x[1];
$refers['table'] = $x[2];
$refers['columns'] = $y;
$fk ['refer'] = $refers;
$meta[$x[1]][$name]['foreign_key'][] = $fk;
$meta[$x[1]][$x[2]]['referential'][$x[3]][] = $name;
}
}
return $meta;
print '<pre>';
print_r ($meta);
print '</pre>';
}
The multi-level meta hash might look something like this:
[ticketing] => Array ( <-- data base
[event] => Array ( <-- table
[foreign_key] => Array (
[0] => Array ( <-- first foreign key
[columns] => Array (
[0] => VenueId
)
[refer] => Array (
[database] => ticketing
[table] => venue
[columns] => Array (
[0] => Id
)
)
)
)
[referential] => Array (
[Id] => Array ( <-- what tables refer to columns of this table
(keyvalue will be comma separated string of column names if composite
foreign key)
[0] => eventseatclass
[1] => price
[2] => reserved
[3] => ticket
)
)
)
[venue] => Array ( <-- table, no foreign keys
[referential] => Array (
[Id] => Array ( <-- column id of this table is referred to by 5 other
tables
[0] => event
[1] => paymenttype
[2] => seat
[3] => seatclass
[4] => venueuser
)
)
)
...
--
Richard A. DeVenezia
--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php