patternphpMinor
Checking referential integrity of a database schema
Viewed 0 times
integritycheckingdatabasereferentialschema
Problem
I am using PHP PDOs to parse the results I am receiving from MySQL queries against a database. I am now running into an issue with running out of allocated memory. Are there any suggestions on improving the efficiency of my code or another more efficient way to handle query results other than parsing PDOs?
This will return whether or not a DB has referential integrity:
```
function generateDSN($host, $dbname)
{
return 'mysql:host='. $host . ';dbname=' . $dbname;
}
$dbName = $argv[2];
//Used for query construction
$dsn = generateDSN($argv[1], $argv[2]);
//create DSN
$link = new PDO($dsn, "username", "password");
//Connect to the database
//PDO($dsn, username, password)
if ($link->connect_error)
{
die("Connection failed: " . $link->connect_error);
}
else
{
echo "Connected successfully\n";
}
//validate database connection
$query = "SELECT TABLE_CONSTRAINTS.TABLE_NAME, KEY_COLUMN_USAGE.COLUMN_NAME, KEY_COLUMN_USAGE.REFERENCED_TABLE_NAME, KEY_COLUMN_USAGE.REFERENCED_COLUMN_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS RIGHT OUTER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE ON INFORMATION_SCHEMA.TABLE_CONSTRAINTS.CONSTRAINT_NAME = INFORMATION_SCHEMA.KEY_COLUMN_USAGE.CONSTRAINT_NAME WHERE INFORMATION_SCHEMA.KEY_COLUMN_USAGE.CONSTRAINT_NAME <> 'PRIMARY' AND INFORMATION_SCHEMA.TABLE_CONSTRAINTS.CONSTRAINT_TYPE = 'FOREIGN KEY' AND INFORMATION_SCHEMA.TABLE_CONSTRAINTS.TABLE_SCHEMA = '".$dbName."';";
//Create query to return list of tables with foreign keys
/* Query return format:
+--------------+------------------------+-----------------------+------------------------+
| TABLE_NAME | COLUMN_NAME | REFERENCED_TABLE_NAME | REFERENCED_COLUMN_NAME |
+--------------+------------------------+-----------------------+------------------------+
*/
$result = $link->query($query);
//Get query results
$x = 0;
$tableA = [];
$tableB = [];
//Create arrays to hold data from FK queries
while($tables = $result->fetch(PDO::FETCH_ASSOC))
{
$test[
This will return whether or not a DB has referential integrity:
```
function generateDSN($host, $dbname)
{
return 'mysql:host='. $host . ';dbname=' . $dbname;
}
$dbName = $argv[2];
//Used for query construction
$dsn = generateDSN($argv[1], $argv[2]);
//create DSN
$link = new PDO($dsn, "username", "password");
//Connect to the database
//PDO($dsn, username, password)
if ($link->connect_error)
{
die("Connection failed: " . $link->connect_error);
}
else
{
echo "Connected successfully\n";
}
//validate database connection
$query = "SELECT TABLE_CONSTRAINTS.TABLE_NAME, KEY_COLUMN_USAGE.COLUMN_NAME, KEY_COLUMN_USAGE.REFERENCED_TABLE_NAME, KEY_COLUMN_USAGE.REFERENCED_COLUMN_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS RIGHT OUTER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE ON INFORMATION_SCHEMA.TABLE_CONSTRAINTS.CONSTRAINT_NAME = INFORMATION_SCHEMA.KEY_COLUMN_USAGE.CONSTRAINT_NAME WHERE INFORMATION_SCHEMA.KEY_COLUMN_USAGE.CONSTRAINT_NAME <> 'PRIMARY' AND INFORMATION_SCHEMA.TABLE_CONSTRAINTS.CONSTRAINT_TYPE = 'FOREIGN KEY' AND INFORMATION_SCHEMA.TABLE_CONSTRAINTS.TABLE_SCHEMA = '".$dbName."';";
//Create query to return list of tables with foreign keys
/* Query return format:
+--------------+------------------------+-----------------------+------------------------+
| TABLE_NAME | COLUMN_NAME | REFERENCED_TABLE_NAME | REFERENCED_COLUMN_NAME |
+--------------+------------------------+-----------------------+------------------------+
*/
$result = $link->query($query);
//Get query results
$x = 0;
$tableA = [];
$tableB = [];
//Create arrays to hold data from FK queries
while($tables = $result->fetch(PDO::FETCH_ASSOC))
{
$test[
Solution
This code does not work properly. Basically you build two enormous arrays containing all values of foreign keys in your database. That's probably a lot.
1: The
2: The comparison of tablet A and B should be moved inside the while() loop.
I also suggest some unset's and closures of resources that are no longer needed.
1: The
$x and $test variables serve no purpose and should be removed.2: The comparison of tablet A and B should be moved inside the while() loop.
I also suggest some unset's and closures of resources that are no longer needed.
Context
StackExchange Code Review Q#84571, answer score: 3
Revisions (0)
No revisions yet.