Come posso verificare se esiste una tabella MySQL con PHP?

Come semplice in teoria, sembra che abbia fatto una buona dose di ricerche e sto avendo problemi a capirlo.

Come posso verificare se esiste una tabella MySQL e se fa qualcosa. (Suppongo che una semplice istruzione php if / else possa funzionare per questo)

C'è un modo per fare questo?

Questo è quello che ho fatto con la risposta di cwallenpoole:

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"); } 

 // 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... } 

Certo, è più Pythonico dell'idioma PHP, ma d'altra parte, non devi preoccuparti di gestire una quantità enorme di dati extra.

modificare

Quindi, questa risposta è stata segnata alless due volte al momento in cui scrivo questo messaggio. Supponendo di aver commesso un errore gigantesco, sono andato e ho eseguito alcuni benchmark , e questo è quello che ho trovato che la mia soluzione è oltre il 10% più veloce dell'alternativa più vicina quando la tabella non esiste, e oltre il 25% più veloce quando tabella esiste:

 :::::::::::::::::::::::::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 

Ho provato a farlo funzionare con DESC, ma ho avuto un timeout dopo 276 secondi (24 secondi per la mia risposta, 276 per non riuscire a completare la descrizione di una tabella non esistente).

Per buona misura, sto confrontando uno schema con solo quattro tabelle e questa è un'installazione MySQL quasi nuova (questo è l'unico database finora). Per vedere l'esportzione, guarda qui .

E INOLTRE

Questa particolare soluzione è anche più indipendente dal database in quanto la stessa query functionrà in PgSQL e Oracle.

FINALMENTE

mysql_query() restituisce FALSE per errori che non sono "questa tabella non esiste".

Se è necessario garantire che la tabella non esista, utilizzare mysql_errno() per get il codice di errore e confrontarlo con gli errori MySQL rilevanti.

Il modo più pulito per get questo risultato in PHP è semplicemente usare la dichiarazione DESCRIBE.

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

Non sono sicuro del motivo per cui gli altri postano query complicate per un problema così semplice.

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

Se non vengono restituiti record, allora non esiste.

Esiste una tabella di 125 microsecondi

.000125 sec. (125μs)

 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 

Il tempo di esecuzione, misurato usando la profilazione mysql, quando una tabella esiste o less, è di circa .000125 sec. (125μs)

Il LIMIT 1 è importnte per la velocità. Ciò minimizza i tempi di stato delle query dei risultati di sorting e dei dati di invio. E la dimensione della tabella non è un fattore.

Uso sempre una query senza buffer quando non sono richiesti risultati.

RISULTATI DEL PROFILO QUANDO LA TABELLA NON ESISTE

 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 

QUANDO SI TABELLA ESISTE

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

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

Non usare mysql_list_tables(); perché è deprecato

Ancora più veloce di una brutta query:

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

In questo modo puoi semplicemente recuperare un field e un valore. .016 secondi per il mio sistema più lento.

Era già pubblicato ma eccolo con PDO (stessa query) …

 $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"; } 

Funziona come un fascino per me ….

Ed ecco un altro approccio (penso che sia più lento) …

 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"; } 

Puoi anche giocare con questa query:

 SHOW TABLE STATUS FROM db_name LIKE 'tbl_name' 

Penso che questo sia stato suggerito per l'uso nella pagina mysql.

MOSTRARE TABELLE COME 'TableName'

Se hai QUALSIASI risultato, la tabella esiste.

Per utilizzare questo approccio in DOP:

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

Per utilizzare questo approccio con mysql_query DEPRECATED

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

NON USARE MYSQL ANY MORE. Se devi usare mysqli ma PDO è il migliore:

 $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. 

O potresti usare

mostra le tabelle in cui Tables_in_ {insert_db_name} = 'tablename';

È ansible utilizzare molte query diverse per verificare se esiste una tabella. Di seguito è riportto un confronto tra diversi:

 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 

Questi benchmark sono solo delle medie: