web-dev-qa-db-de.com

Wie kann ich überprüfen, ob eine MySQL-Tabelle mit PHP vorhanden ist?

So einfach in der Theorie, wie es sich anhört, ich habe ziemlich viel recherchiert und habe Schwierigkeiten, dies herauszufinden.

Wie kann ich überprüfen, ob eine MySQL-Tabelle existiert und ob sie etwas tut? (Ich denke, eine einfache PHP-if/else-Anweisung könnte dafür funktionieren.)

Gibt es eine Möglichkeit, dies zu tun?

Das habe ich mit der Antwort von cwallenpoole getan:

mysql_connect("SERVER","USERNAME","PASSWORD");
mysql_select_db('DATABASE');

$val = mysql_query('select 1 from `TABLE`');

if($val !== FALSE)
{
   print("Exists");
}else{
   print("Doesn't exist");
}
31
John Doe
// Select 1 from table_name will return false if the table does not exist.
$val = mysql_query('select 1 from `table_name` LIMIT 1');

if($val !== FALSE)
{
   //DO SOMETHING! IT EXISTS!
}
else
{
    //I can't find it...
}

Zugegebenermaßen handelt es sich dabei um mehr Pythonic als um das PHP - Idiom, aber auf der anderen Seite müssen Sie sich nicht mit einer Menge zusätzlicher Daten beschäftigen.

Bearbeiten

Diese Antwort wurde also mindestens zweimal markiert, seit ich diese Nachricht schreibe. Angenommen, ich hätte einen gigantischen Fehler begangen, bin ich gegangen und habe einige Benchmarks ausgeführt, und ich habe festgestellt, dass meine Lösung über 10% schneller ist als die nächste Alternative, wenn der Tisch nicht existiert, und über 25 % schneller, wenn die Tabelle existiert:

:::::::::::::::::::::::::BEGINNING NON-EXISTING TABLE::::::::::::::::::::::::::::::
23.35501408577 for bad select
25.408507823944 for select from schema num rows -- calls mysql_num_rows on select... from information_schema.
25.336688995361 for select from schema fetch row -- calls mysql_fetch_row on select... from information_schema result
50.669058799744 for SHOW TABLES FROM test
:::::::::::::::::::::::::BEGINNING EXISTING TABLE::::::::::::::::::::::::::::::
15.293519973755 for good select
20.784908056259 for select from schema num rows
21.038464069366 for select from schema fetch row
50.400309085846 for SHOW TABLES FROM test

Ich habe versucht, dies gegen DESC auszuführen, aber nach 276 Sekunden hatte ich eine Auszeit (24 Sekunden für meine Antwort, 276 konnte die Beschreibung einer nicht vorhandenen Tabelle nicht abschließen).

Für ein gutes Maß ist ein Benchmarking mit einem Schema mit nur vier Tabellen darin. Dies ist eine fast neue MySQL-Installation (dies ist bisher die einzige Datenbank). Um den Export zu sehen, sehen Sie hier .

UND AUSSERDEM

Diese spezielle Lösung ist auch mehr datenbankunabhängig, da dieselbe Abfrage in PgSQL und Oracle funktioniert.

ENDLICH

mysql_query() gibt FALSE für Fehler zurück, die nicht "Diese Tabelle existiert nicht".

Wenn Sie sicherstellen müssen, dass die Tabelle nicht vorhanden ist, verwenden Sie mysql_errno(), um den Fehlercode abzurufen, und vergleichen Sie ihn mit den entsprechenden MySQL-Fehlern .

64
cwallenpoole

Der sauberste Weg, um dies in PHP zu erreichen, ist die DESCRIBE-Anweisung.

if(mysql_query("DESCRIBE `table`")) {
    // Exists
}

Ich bin mir nicht sicher, warum andere komplizierte Anfragen für ein derart direktes Problem stellen.

23
Aleksey Korzun
$res = mysql_query("SELECT table_name FROM information_schema.tables WHERE table_schema = '$databasename' AND table_name = '$tablename';");

Wenn keine Datensätze zurückgegeben werden, sind sie nicht vorhanden.

13
Nathan Romano

Überprüfung der 125-Mikrosekunden-Tabelle

.000125 sek. (125 us)

mysql_unbuffered_query("SET profiling = 1");  // for profiling only

@mysql_unbuffered_query("SELECT 1 FROM `table` LIMIT 1 ");
if (mysql_errno() == 1146){

 // NO EXISTING TABLE CODE GOES HERE

}
elseif(mysql_errno() > 0){

  echo mysql_error();    

}

$results = mysql_query("SHOW PROFILE");  // for profiling only

Die Ausführungszeit, gemessen mit dem mysql-Profiling, wenn eine Tabelle existiert oder nicht, beträgt ungefähr .000125 Sekunden. (125 us)  

Der LIMIT 1 ist wichtig für die Geschwindigkeit. Dies minimiert die Abfragezeiten für das Sortierergebnis und das Senden von Daten. Und die Tischgröße spielt keine Rolle. 

Ich verwende immer eine ungepufferte Abfrage, wenn keine Ergebnisse erforderlich sind. 

PROFIL ERGEBNISSE WENN DIE TABELLE NICHT BESTEHT

QUERY STATE           SECONDS   
--------------------  -------
starting              0.000025  
checking permissions  0.000006  
Opening tables        0.000065  
query end             0.000005  
closing tables        0.000003  
freeing items         0.000013  
logging slow query    0.000003  
cleaning up           0.000003  
TOTAL                 0.000123  <<<<<<<<<<<< 123 microseconds

WENN DIE TABELLE VORHANDEN IST  

QUERY STATE           SECONDS   
--------------------  -------
starting              0.000024
checking permissions  0.000005
Opening tables        0.000013
System lock           0.000007
init                  0.000006
optimizing            0.000003
statistics            0.000009
preparing             0.000008
executing             0.000003
Sending data          0.000019
end                   0.000004
query end             0.000004
closing tables        0.000006
freeing items         0.00001
logging slow query    0.000003
cleaning up           0.000003
TOTAL                 0.000127 <<<<<<<<<<<< 127 microseconds
10
Misunderstood
mysql_query("SHOW TABLES FROM yourDB");
//> loop thru results and see if it exists
//> in this way with only one query one can check easly more table 

oder mysql_query("SHOW TABLES LIKE 'tblname'");

Verwenden Sie nicht mysql_list_tables();, da es veraltet ist

9
dynamic

Noch schneller als eine schlechte Abfrage:

SELECT count((1)) as `ct`  FROM INFORMATION_SCHEMA.TABLES where table_schema ='yourdatabasename' and table_name='yourtablename';

Auf diese Weise können Sie nur ein Feld und einen Wert abrufen. .016 Sekunden für mein langsameres System.

5
JasonMichael

Tabellen anzeigen wie 'tableName'

Wenn Sie irgendwelche Ergebnisse haben, ist die Tabelle vorhanden.

So verwenden Sie diesen Ansatz in PDO:

$pdo         = new \PDO(/*...*/);
$result      = $pdo->query("SHOW TABLES LIKE 'tableName'");
$tableExists = $result !== false && $result->rowCount() > 0;

So verwenden Sie diesen Ansatz mit DEPRECATED mysql_query

$result      = mysql_query("SHOW TABLES LIKE 'tableName'");
$tableExists = mysql_num_rows($result) > 0;
4
Kevin Nelson

Es wurde bereits gepostet, aber hier ist es mit PDO (gleiche Abfrage) ...

$connection = new PDO ( "mysql:Host=host_db; dbname=name_db", user_db, pass_db );

if ($connection->query ("DESCRIBE table_name"  )) {
    echo "exist";
} else {
    echo "doesn't exist";
}

Funktioniert wie ein Zauber für mich ....

Und hier ist ein anderer Ansatz (ich denke es ist langsamer) ...

if ($connection->query ( "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = 'db_name' AND table_name ='tbl_name'" )->fetch ()) {
    echo "exist";
} else {
    echo "doesn't exist";
}

Sie können auch mit dieser Abfrage spielen:

SHOW TABLE STATUS FROM db_name LIKE 'tbl_name'

Ich denke, dies wurde zur Verwendung in der MySQL-Seite empfohlen.

3
I_Minkov

VERWENDEN SIE MEHR NICHT MEHR. Wenn Sie mysqli verwenden müssen, ist PDO jedoch am besten:

$pdo = new PDO($dsn, $username, $pdo); // proper PDO init string here
if ($pdo->query("SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = 'db_name'")->fetch()) // table exists.
2
chx

Oder du könntest es gebrauchen 

tabellen anzeigen, in denen Tables_in_ {insert_db_name} = 'Tabellenname';

0
DanielM
<?php 
$connection = mysqli_connect("localhost","root","","php_sample_login_register"); 

if ($connection){
        echo "DB is Connected <br>";
        $sql = "CREATE TABLE user(
            id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
            name VARCHAR(255)NOT NULL,
            email VARCHAR(255)NOT NULL,
            password VARCHAR(255) NOT NULL
            );";
        if(mysqli_query($connection,$sql)) {
            echo "Created user table";
        } else{
            echo "User table already exists";
        }
    } else {
        echo "error : DB isnot connected";
    } ?>
0
wasantha

Sie können viele verschiedene Abfragen verwenden, um zu überprüfen, ob eine Tabelle vorhanden ist. Unten ist ein Vergleich zwischen mehreren:

mysql_query('select 1 from `table_name` group by 1'); or  
mysql_query('select count(*) from `table_name`');

mysql_query("DESCRIBE `table_name`");  
70000   rows: 24ms  
1000000 rows: 24ms  
5000000 rows: 24ms

mysql_query('select 1 from `table_name`');  
70000   rows: 19ms  
1000000 rows: 23ms  
5000000 rows: 29ms

mysql_query('select 1 from `table_name` group by 1'); or  
mysql_query('select count(*) from `table_name`');  
70000   rows: 18ms  
1000000 rows: 18ms  
5000000 rows: 18ms  

Diese Benchmarks sind nur Durchschnittswerte:

0
Mantra