web-dev-qa-db-ja.com

PHPにMySQLテーブルが存在するかどうかを確認するにはどうすればよいですか?

理論的には単純に聞こえますが、私はかなりの量の研究を行っており、これを理解するのに苦労しています。

MySQLテーブルが存在し、それが何かを行うかどうかを確認するにはどうすればよいですか。 (単純なphp if/elseステートメントがこれに役立つと思います)

これを行う方法はありますか?

これは私が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");
}
33
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...
}
_

確かに、これはPHPイディオムよりもPythonicですが、一方で、大量の余分なデータを扱うことを心配する必要はありません。

編集

したがって、この回答は、このメッセージを書いている時点で少なくとも2回マークダウンされています。私はいくつかの巨大なエラーを犯したと仮定して、私は行って、いくつかの ベンチマーク を実行しました。これは、テーブルが存在しない場合、最も近い代替案よりも私のソリューションが10%以上高速であることがわかりましたテーブルが存在する場合、25%以上速くなります。

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

DESCに対してこれを実行しようとしましたが、276秒後にタイムアウトが発生しました(私の回答では24秒、276は存在しないテーブルの記述を完了できませんでした)。

良い尺度として、4つのテーブルのみが含まれるスキーマに対してベンチマークを行っていますが、これはほとんど新しいMySQLインストールです(これがこれまでの唯一のデータベースです)。エクスポートを確認するには、 here を見てください。

そしてさらに

この特定のソリューションは、同じクエリがPgSQLとOracleで機能するため、データベースに依存しません。

最後に

mysql_query()は、「このテーブルが存在しません」でないエラーに対してFALSEを返します。

テーブルが存在しないことを保証する必要がある場合mysql_errno()を使用してエラーコードを取得し、関連するものと比較します。 MySQLエラー

69
cwallenpoole

PHPでこれを実現する最もクリーンな方法は、DESCRIBEステートメントを使用することです。

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

他の人がこのような単純な問題に対して複雑なクエリを投稿している理由はわかりません。

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

レコードが返されない場合は存在しません。

13
Nathan Romano

125マイクロ秒のテーブルの存在チェック

.000125秒(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

テーブルが存在するかどうかにかかわらず、mysqlプロファイリングを使用して測定される実行時間は約。000125秒(125µs)

LIMIT 1は速度にとって重要です。これにより、並べ替え結果と送信データクエリの状態時間が最小化されます。また、テーブルのサイズは要因ではありません。

結果が不要な場合は、常にバッファなしクエリを使用します。

プロファイルの結果テーブルが存在しない場合

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

テーブルが存在する場合

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

またはmysql_query("SHOW TABLES LIKE 'tblname'");

mysql_list_tables();は使用しないでください。使用しないでください

9
dynamic

不正なクエリよりも高速です:

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

この方法では、1つのフィールドと1つの値を取得できます。遅いシステムでは.016秒。

6
JasonMichael

「TableName」のようなテーブルを表示する

結果があれば、テーブルが存在します。

PDOでこのアプローチを使用するには:

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

非推奨mysql_queryでこのアプローチを使用するには

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

すでに投稿されていますが、ここではPDO(同じクエリ)を使用しています...

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

私にとって魅力のように機能します。

そして、ここに別のアプローチがあります(遅いと思います)...

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

このクエリで遊ぶこともできます:

SHOW TABLE STATUS FROM db_name LIKE 'tbl_name'

これはmysqlページで使用することが提案されたと思います。

3
I_Minkov

MYSQLをこれ以上使用しないでください。 mysqliを使用する必要があるが、PDOが最適な場合:

$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

または使用できます

tables_in_ {insert_db_name} = 'tablename'のテーブルを表示します。

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

多くの異なるクエリを使用して、テーブルが存在するかどうかを確認できます。以下はいくつかの比較です:

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  

これらのベンチマークは単なる平均です。

0
Mantra