理論的には単純に聞こえますが、私はかなりの量の研究を行っており、これを理解するのに苦労しています。
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");
}
_// 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エラー 。
PHPでこれを実現する最もクリーンな方法は、DESCRIBEステートメントを使用することです。
if(mysql_query("DESCRIBE `table`")) {
// Exists
}
他の人がこのような単純な問題に対して複雑なクエリを投稿している理由はわかりません。
$res = mysql_query("SELECT table_name FROM information_schema.tables WHERE table_schema = '$databasename' AND table_name = '$tablename';");
レコードが返されない場合は存在しません。
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
_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();
は使用しないでください。使用しないでください
不正なクエリよりも高速です:
SELECT count((1)) as `ct` FROM INFORMATION_SCHEMA.TABLES where table_schema ='yourdatabasename' and table_name='yourtablename';
この方法では、1つのフィールドと1つの値を取得できます。遅いシステムでは.016秒。
「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;
すでに投稿されていますが、ここでは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ページで使用することが提案されたと思います。
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.
または使用できます
tables_in_ {insert_db_name} = 'tablename'のテーブルを表示します。
<?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";
} ?>
多くの異なるクエリを使用して、テーブルが存在するかどうかを確認できます。以下はいくつかの比較です:
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
これらのベンチマークは単なる平均です。